@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.
@@ -1,8 +1,17 @@
1
- import type { LanguagePlugin, ProviderResult, ServerProjectProvider, TypeScriptProjectHost } from '@volar/language-server';
2
- import { Disposable, ServiceEnvironment } from '@vue/language-service';
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
- export type GetLanguagePlugin = (serviceEnv: ServiceEnvironment, configFileName?: string, host?: TypeScriptProjectHost, sys?: ts.System & {
5
- version: number;
6
- sync(): Promise<number>;
7
- } & Disposable) => ProviderResult<LanguagePlugin[]>;
8
- export declare function createHybridModeProjectProviderFactory(sys: ts.System, getLanguagePlugins: GetLanguagePlugin): ServerProjectProvider;
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;
@@ -1,78 +1,81 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createHybridModeProjectProviderFactory = void 0;
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 createHybridModeProjectProviderFactory(sys, getLanguagePlugins) {
9
+ function createHybridModeProject(sys, getLanguagePlugins) {
12
10
  let initialized = false;
13
- const serviceEnvs = (0, uriMap_1.createUriMap)(sys.useCaseSensitiveFileNames);
14
- const tsconfigProjects = (0, uriMap_1.createUriMap)(sys.useCaseSensitiveFileNames);
15
- const simpleProjects = (0, uriMap_1.createUriMap)(sys.useCaseSensitiveFileNames);
11
+ let simpleLs;
12
+ let serviceEnv;
13
+ let server;
14
+ const tsconfigProjects = (0, language_service_1.createUriMap)(sys.useCaseSensitiveFileNames);
16
15
  return {
17
- async get(uri) {
16
+ setup(_server) {
17
+ server = _server;
18
+ },
19
+ async getLanguageService(uri) {
18
20
  if (!initialized) {
19
21
  initialized = true;
20
- initialize(this);
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 = serviceEnv.typescript.uriToFileName(uri);
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.parse(serviceEnv.typescript.fileNameToUri(tsconfig));
28
+ const tsconfigUri = vscode_uri_1.URI.file(tsconfig);
34
29
  if (!tsconfigProjects.has(tsconfigUri)) {
35
30
  tsconfigProjects.set(tsconfigUri, (async () => {
36
- const languagePlugins = await getLanguagePlugins(serviceEnv, tsconfig, undefined, {
37
- ...sys,
38
- version: 0,
39
- async sync() {
40
- return 0;
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
- dispose() { },
43
+ asFileName,
43
44
  });
44
- return createTSConfigProject(this, serviceEnv, languagePlugins);
45
+ return createLs(server, serviceEnv, languagePlugins);
45
46
  })());
46
47
  }
47
48
  return await tsconfigProjects.get(tsconfigUri);
48
49
  }
49
50
  else {
50
- if (!simpleProjects.has(workspaceFolder)) {
51
- simpleProjects.set(workspaceFolder, (async () => {
52
- const languagePlugins = await getLanguagePlugins(serviceEnv);
53
- return (0, simpleProject_1.createSimpleServerProject)(this, serviceEnv, languagePlugins);
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 all() {
59
+ async getExistingLanguageServices() {
60
60
  return Promise.all([
61
61
  ...tsconfigProjects.values(),
62
- ...simpleProjects.values(),
63
- ]);
62
+ simpleLs,
63
+ ].filter(notEmpty));
64
64
  },
65
65
  reload() {
66
- for (const project of [
66
+ for (const ls of [
67
67
  ...tsconfigProjects.values(),
68
- ...simpleProjects.values(),
68
+ simpleLs,
69
69
  ]) {
70
- project.then(p => p.dispose());
70
+ ls?.then(ls => ls.dispose());
71
71
  }
72
72
  tsconfigProjects.clear();
73
- simpleProjects.clear();
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 createTSConfigProject(server, serviceEnv, languagePlugins) {
89
- let languageService;
90
- return {
91
- getLanguageService,
92
- getLanguageServiceDontCreate: () => languageService,
93
- dispose() {
94
- languageService?.dispose();
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
- return languageService;
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.createHybridModeProjectProviderFactory = createHybridModeProjectProviderFactory;
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
@@ -1,5 +1,4 @@
1
- import type { InitializationOptions } from '@volar/language-server';
2
- export type VueInitializationOptions = InitializationOptions & {
1
+ export type VueInitializationOptions = {
3
2
  typescript: {
4
3
  tsdk: string;
5
4
  };
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
- semanticTokensLegend: import("@volar/language-server").SemanticTokensLegend;
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
- uriConverter: {
14
- uriToFileName: (uri: string, parsed?: import("vscode-uri").URI | undefined) => string;
15
- fileNameToUri: (fileName: string) => string;
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").InitializeResult<any>;
18
+ } | undefined) => import("@volar/language-server").VolarInitializeResult;
30
19
  initialized: () => void;
31
- shutdown: () => Promise<void>;
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").ServerProjectProvider) => Promise<void>;
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, host, sys) => {
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, serviceEnv.typescript.uriToFileName, sys?.useCaseSensitiveFileNames ?? false, () => host?.getProjectVersion?.() ?? '', () => host?.getScriptFileNames() ?? [], commandLine?.options ?? {}, vueOptions);
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, env => envToVueOptions.get(env));
72
+ getTsPluginClient = (0, language_service_1.createDefaultGetTsPluginClient)(tsdk.typescript);
66
73
  }
67
- const result = exports.server.initialize(params, (0, language_service_1.getVueLanguageServicePlugins)(tsdk.typescript, env => envToVueOptions.get(env), getTsPluginClient, hybridMode), hybridMode
68
- ? (0, hybridModeProject_1.createHybridModeProjectProviderFactory)(tsdk.typescript.sys, exports.getLanguagePlugins)
69
- : (0, node_1.createTypeScriptProjectProvider)(tsdk.typescript, tsdk.diagnosticMessages, (env, ctx) => (0, exports.getLanguagePlugins)(env, ctx.configFileName, ctx.host, ctx.sys)), {
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 languageService = await getService(params.textDocument.uri);
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, params.textDocument.uri);
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 languageService = await getService(params.textDocument.uri);
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, params.textDocument.uri, params.casing, getTsPluginClient(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 languageService = await getService(params.textDocument.uri);
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, params.textDocument.uri, params.casing, getTsPluginClient(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.projects.get.call(exports.server, uri)).getLanguageService();
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.19",
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.2.4",
19
- "@volar/language-server": "~2.2.4",
20
- "@vue/language-core": "2.0.19",
21
- "@vue/language-service": "2.0.19",
22
- "@vue/typescript-plugin": "2.0.19",
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": "a9fae154ad1efc4359866cfd10251d53e4b0faed"
26
+ "gitHead": "e1a5d2f136bf60a772c9655f9f5474c7f71a2ff9"
27
27
  }