@vue/language-server 2.0.7 → 2.0.11
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 +3 -0
- package/lib/hybridModeProject.js +114 -0
- package/node.js +22 -21
- package/package.json +7 -7
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createHybridModeProjectProviderFactory = void 0;
|
|
4
|
+
const simpleProject_1 = require("@volar/language-server/lib/project/simpleProject");
|
|
5
|
+
const simpleProjectProvider_1 = require("@volar/language-server/lib/project/simpleProjectProvider");
|
|
6
|
+
const language_core_1 = require("@vue/language-core");
|
|
7
|
+
const language_service_1 = require("@vue/language-service");
|
|
8
|
+
const utils_1 = require("@vue/typescript-plugin/lib/utils");
|
|
9
|
+
function createHybridModeProjectProviderFactory(sys) {
|
|
10
|
+
return (context, servicePlugins, getLanguagePlugins) => {
|
|
11
|
+
const serviceEnvs = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
|
|
12
|
+
const tsconfigProjects = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
|
|
13
|
+
const simpleProjects = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
|
|
14
|
+
context.onDidChangeWatchedFiles(({ changes }) => {
|
|
15
|
+
for (const change of changes) {
|
|
16
|
+
if (tsconfigProjects.has(change.uri)) {
|
|
17
|
+
tsconfigProjects.get(change.uri)?.then(project => project.dispose());
|
|
18
|
+
tsconfigProjects.delete(change.uri);
|
|
19
|
+
context.reloadDiagnostics();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
async getProject(uri) {
|
|
25
|
+
const workspaceFolder = (0, simpleProjectProvider_1.getWorkspaceFolder)(uri, context.workspaceFolders);
|
|
26
|
+
let serviceEnv = serviceEnvs.get(workspaceFolder);
|
|
27
|
+
if (!serviceEnv) {
|
|
28
|
+
serviceEnv = (0, simpleProjectProvider_1.createServiceEnvironment)(context, workspaceFolder);
|
|
29
|
+
serviceEnvs.set(workspaceFolder, serviceEnv);
|
|
30
|
+
}
|
|
31
|
+
const fileName = serviceEnv.typescript.uriToFileName(uri);
|
|
32
|
+
const projectInfo = (await (0, utils_1.searchNamedPipeServerForFile)(fileName))?.projectInfo;
|
|
33
|
+
if (projectInfo?.kind === 1) {
|
|
34
|
+
const tsconfig = projectInfo.name;
|
|
35
|
+
const tsconfigUri = serviceEnv.typescript.fileNameToUri(tsconfig);
|
|
36
|
+
if (!tsconfigProjects.has(tsconfigUri)) {
|
|
37
|
+
tsconfigProjects.set(tsconfigUri, (async () => {
|
|
38
|
+
const languagePlugins = await getLanguagePlugins(serviceEnv, {
|
|
39
|
+
typescript: {
|
|
40
|
+
configFileName: tsconfig,
|
|
41
|
+
host: {
|
|
42
|
+
getScriptFileNames() {
|
|
43
|
+
return [];
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
sys: {
|
|
47
|
+
...sys,
|
|
48
|
+
version: 0,
|
|
49
|
+
async sync() {
|
|
50
|
+
return 0;
|
|
51
|
+
},
|
|
52
|
+
dispose() { },
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
return createTSConfigProject(context, serviceEnv, languagePlugins, servicePlugins);
|
|
57
|
+
})());
|
|
58
|
+
}
|
|
59
|
+
return await tsconfigProjects.get(tsconfigUri);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
if (!simpleProjects.has(workspaceFolder)) {
|
|
63
|
+
simpleProjects.set(workspaceFolder, (() => {
|
|
64
|
+
return (0, simpleProject_1.createSimpleServerProject)(context, serviceEnv, servicePlugins, getLanguagePlugins);
|
|
65
|
+
})());
|
|
66
|
+
}
|
|
67
|
+
return await simpleProjects.get(workspaceFolder);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
async getProjects() {
|
|
71
|
+
return Promise.all([
|
|
72
|
+
...tsconfigProjects.values(),
|
|
73
|
+
...simpleProjects.values(),
|
|
74
|
+
]);
|
|
75
|
+
},
|
|
76
|
+
async reloadProjects() {
|
|
77
|
+
for (const project of [
|
|
78
|
+
...tsconfigProjects.values(),
|
|
79
|
+
...simpleProjects.values(),
|
|
80
|
+
]) {
|
|
81
|
+
(await project).dispose();
|
|
82
|
+
}
|
|
83
|
+
tsconfigProjects.clear();
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
function createTSConfigProject(context, serviceEnv, languagePlugins, servicePlugins) {
|
|
87
|
+
let languageService;
|
|
88
|
+
return {
|
|
89
|
+
getLanguageService,
|
|
90
|
+
getLanguageServiceDontCreate: () => languageService,
|
|
91
|
+
dispose() {
|
|
92
|
+
languageService?.dispose();
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
function getLanguageService() {
|
|
96
|
+
if (!languageService) {
|
|
97
|
+
const language = (0, language_core_1.createLanguage)(languagePlugins, false, uri => {
|
|
98
|
+
const script = context.documents.get(uri);
|
|
99
|
+
if (script) {
|
|
100
|
+
language.scripts.set(uri, script.languageId, script.getSnapshot());
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
language.scripts.delete(uri);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
languageService = (0, language_service_1.createLanguageService)(language, servicePlugins, serviceEnv);
|
|
107
|
+
}
|
|
108
|
+
return languageService;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
exports.createHybridModeProjectProviderFactory = createHybridModeProjectProviderFactory;
|
|
114
|
+
//# sourceMappingURL=hybridModeProject.js.map
|
package/node.js
CHANGED
|
@@ -4,10 +4,10 @@ exports.server = exports.connection = void 0;
|
|
|
4
4
|
const node_1 = require("@volar/language-server/node");
|
|
5
5
|
const language_core_1 = require("@vue/language-core");
|
|
6
6
|
const language_service_1 = require("@vue/language-service");
|
|
7
|
-
const protocol_1 = require("./lib/protocol");
|
|
8
7
|
const tsPluginClient = require("@vue/typescript-plugin/lib/client");
|
|
9
8
|
const utils_1 = require("@vue/typescript-plugin/lib/utils");
|
|
10
|
-
const
|
|
9
|
+
const hybridModeProject_1 = require("./lib/hybridModeProject");
|
|
10
|
+
const protocol_1 = require("./lib/protocol");
|
|
11
11
|
exports.connection = (0, node_1.createConnection)();
|
|
12
12
|
exports.server = (0, node_1.createServer)(exports.connection);
|
|
13
13
|
const envToVueOptions = new WeakMap();
|
|
@@ -17,8 +17,8 @@ exports.connection.listen();
|
|
|
17
17
|
exports.connection.onInitialize(async (params) => {
|
|
18
18
|
const options = params.initializationOptions;
|
|
19
19
|
const hybridMode = options.vue?.hybridMode ?? true;
|
|
20
|
-
tsdk = (0, node_1.loadTsdkByPath)(options.typescript.tsdk, params.locale);
|
|
21
20
|
const vueFileExtensions = ['vue'];
|
|
21
|
+
tsdk = (0, node_1.loadTsdkByPath)(options.typescript.tsdk, params.locale);
|
|
22
22
|
if (options.vue?.additionalExtensions) {
|
|
23
23
|
for (const additionalExtension of options.vue.additionalExtensions) {
|
|
24
24
|
vueFileExtensions.push(additionalExtension);
|
|
@@ -31,9 +31,23 @@ exports.connection.onInitialize(async (params) => {
|
|
|
31
31
|
getTsPluginClient = (0, language_service_1.createDefaultGetTsPluginClient)(tsdk.typescript, env => envToVueOptions.get(env));
|
|
32
32
|
}
|
|
33
33
|
const result = await exports.server.initialize(params, hybridMode
|
|
34
|
-
? (0,
|
|
34
|
+
? (0, hybridModeProject_1.createHybridModeProjectProviderFactory)(tsdk.typescript.sys)
|
|
35
35
|
: (0, node_1.createTypeScriptProjectProviderFactory)(tsdk.typescript, tsdk.diagnosticMessages), {
|
|
36
36
|
watchFileExtensions: ['js', 'cjs', 'mjs', 'ts', 'cts', 'mts', 'jsx', 'tsx', 'json', ...vueFileExtensions],
|
|
37
|
+
getLanguageId(uri) {
|
|
38
|
+
if (vueFileExtensions.some(ext => uri.endsWith(`.${ext}`))) {
|
|
39
|
+
if (uri.endsWith('.html')) {
|
|
40
|
+
return 'html';
|
|
41
|
+
}
|
|
42
|
+
else if (uri.endsWith('.md')) {
|
|
43
|
+
return 'markdown';
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return 'vue';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return (0, language_core_1.resolveCommonLanguageId)(uri);
|
|
50
|
+
},
|
|
37
51
|
getServicePlugins() {
|
|
38
52
|
return (0, language_service_1.createVueServicePlugins)(tsdk.typescript, env => envToVueOptions.get(env), getTsPluginClient, hybridMode);
|
|
39
53
|
},
|
|
@@ -41,24 +55,11 @@ exports.connection.onInitialize(async (params) => {
|
|
|
41
55
|
const commandLine = await parseCommandLine();
|
|
42
56
|
const vueOptions = commandLine?.vueOptions ?? (0, language_core_1.resolveVueCompilerOptions)({});
|
|
43
57
|
for (const ext of vueFileExtensions) {
|
|
44
|
-
if (vueOptions.extensions.includes(`.${ext}`)) {
|
|
58
|
+
if (!vueOptions.extensions.includes(`.${ext}`)) {
|
|
45
59
|
vueOptions.extensions.push(`.${ext}`);
|
|
46
60
|
}
|
|
47
61
|
}
|
|
48
|
-
const vueLanguagePlugin = (0, language_core_1.createVueLanguagePlugin)(tsdk.typescript, serviceEnv.typescript.uriToFileName,
|
|
49
|
-
if (projectContext.typescript?.sys.useCaseSensitiveFileNames ?? false) {
|
|
50
|
-
return projectContext.typescript?.host.getScriptFileNames().includes(fileName) ?? false;
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
const lowerFileName = fileName.toLowerCase();
|
|
54
|
-
for (const rootFile of projectContext.typescript?.host.getScriptFileNames() ?? []) {
|
|
55
|
-
if (rootFile.toLowerCase() === lowerFileName) {
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
}, commandLine?.options ?? {}, vueOptions, options.codegenStack);
|
|
62
|
+
const vueLanguagePlugin = (0, language_core_1.createVueLanguagePlugin)(tsdk.typescript, serviceEnv.typescript.uriToFileName, projectContext.typescript?.sys.useCaseSensitiveFileNames ?? false, () => projectContext.typescript?.host.getProjectVersion?.() ?? '', () => projectContext.typescript?.host.getScriptFileNames() ?? [], commandLine?.options ?? {}, vueOptions, options.codegenStack);
|
|
62
63
|
envToVueOptions.set(serviceEnv, vueOptions);
|
|
63
64
|
return [vueLanguagePlugin];
|
|
64
65
|
async function parseCommandLine() {
|
|
@@ -112,8 +113,8 @@ exports.connection.onRequest(protocol_1.GetConvertAttrCasingEditsRequest.type, a
|
|
|
112
113
|
return await (0, language_service_1.convertAttrName)(languageService.context, params.textDocument.uri, params.casing, getTsPluginClient(languageService.context));
|
|
113
114
|
}
|
|
114
115
|
});
|
|
115
|
-
exports.connection.onRequest(
|
|
116
|
-
const server = await (0, utils_1.searchNamedPipeServerForFile)(fileName);
|
|
116
|
+
exports.connection.onRequest(protocol_1.GetConnectedNamedPipeServerRequest.type, async (fileName) => {
|
|
117
|
+
const server = (await (0, utils_1.searchNamedPipeServerForFile)(fileName))?.server;
|
|
117
118
|
if (server) {
|
|
118
119
|
return server;
|
|
119
120
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vue/language-server",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.11",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -15,12 +15,12 @@
|
|
|
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.2.0-alpha.6",
|
|
19
|
+
"@volar/language-server": "~2.2.0-alpha.6",
|
|
20
|
+
"@vue/language-core": "2.0.11",
|
|
21
|
+
"@vue/language-service": "2.0.11",
|
|
22
|
+
"@vue/typescript-plugin": "2.0.11",
|
|
23
23
|
"vscode-languageserver-protocol": "^3.17.5"
|
|
24
24
|
},
|
|
25
|
-
"gitHead": "
|
|
25
|
+
"gitHead": "c89f25ffc32c760130adeeac796b9a5d20585bf7"
|
|
26
26
|
}
|