@vue/language-server 2.0.14 → 2.0.16

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,3 +1,8 @@
1
- import type { ServerProjectProviderFactory } from '@volar/language-server';
1
+ import type { LanguagePlugin, ProviderResult, ServerProjectProvider, TypeScriptProjectHost } from '@volar/language-server';
2
+ import { Disposable, ServiceEnvironment } from '@vue/language-service';
2
3
  import type * as ts from 'typescript';
3
- export declare function createHybridModeProjectProviderFactory(sys: ts.System): ServerProjectProviderFactory;
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;
@@ -6,109 +6,96 @@ const simpleProjectProvider_1 = require("@volar/language-server/lib/project/simp
6
6
  const language_core_1 = require("@vue/language-core");
7
7
  const language_service_1 = require("@vue/language-service");
8
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 }) => {
9
+ function createHybridModeProjectProviderFactory(sys, getLanguagePlugins) {
10
+ let initialized = false;
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
+ return {
15
+ async get(uri) {
16
+ if (!initialized) {
17
+ initialized = true;
18
+ initialize(this);
19
+ }
20
+ const workspaceFolder = (0, simpleProjectProvider_1.getWorkspaceFolder)(uri, this.workspaceFolders);
21
+ let serviceEnv = serviceEnvs.get(workspaceFolder);
22
+ if (!serviceEnv) {
23
+ serviceEnv = (0, simpleProjectProvider_1.createServiceEnvironment)(this, workspaceFolder);
24
+ serviceEnvs.set(workspaceFolder, serviceEnv);
25
+ }
26
+ const fileName = serviceEnv.typescript.uriToFileName(uri);
27
+ const projectInfo = (await (0, utils_1.searchNamedPipeServerForFile)(fileName))?.projectInfo;
28
+ if (projectInfo?.kind === 1) {
29
+ const tsconfig = projectInfo.name;
30
+ const tsconfigUri = serviceEnv.typescript.fileNameToUri(tsconfig);
31
+ if (!tsconfigProjects.has(tsconfigUri)) {
32
+ tsconfigProjects.set(tsconfigUri, (async () => {
33
+ const languagePlugins = await getLanguagePlugins(serviceEnv, tsconfig, undefined, {
34
+ ...sys,
35
+ version: 0,
36
+ async sync() {
37
+ return 0;
38
+ },
39
+ dispose() { },
40
+ });
41
+ return createTSConfigProject(this, serviceEnv, languagePlugins);
42
+ })());
43
+ }
44
+ return await tsconfigProjects.get(tsconfigUri);
45
+ }
46
+ else {
47
+ if (!simpleProjects.has(workspaceFolder)) {
48
+ simpleProjects.set(workspaceFolder, (async () => {
49
+ const languagePlugins = await getLanguagePlugins(serviceEnv);
50
+ return (0, simpleProject_1.createSimpleServerProject)(this, serviceEnv, languagePlugins);
51
+ })());
52
+ }
53
+ return await simpleProjects.get(workspaceFolder);
54
+ }
55
+ },
56
+ async all() {
57
+ return Promise.all([
58
+ ...tsconfigProjects.values(),
59
+ ...simpleProjects.values(),
60
+ ]);
61
+ },
62
+ };
63
+ function initialize(server) {
64
+ server.onDidChangeWatchedFiles(({ changes }) => {
15
65
  for (const change of changes) {
16
66
  if (tsconfigProjects.has(change.uri)) {
17
67
  tsconfigProjects.get(change.uri)?.then(project => project.dispose());
18
68
  tsconfigProjects.delete(change.uri);
19
- context.reloadDiagnostics();
69
+ server.clearPushDiagnostics();
20
70
  }
21
71
  }
22
72
  });
73
+ }
74
+ function createTSConfigProject(server, serviceEnv, languagePlugins) {
75
+ let languageService;
23
76
  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();
77
+ getLanguageService,
78
+ getLanguageServiceDontCreate: () => languageService,
79
+ dispose() {
80
+ languageService?.dispose();
84
81
  },
85
82
  };
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;
83
+ function getLanguageService() {
84
+ if (!languageService) {
85
+ const language = (0, language_core_1.createLanguage)(languagePlugins, false, uri => {
86
+ const document = server.documents.get(uri);
87
+ if (document) {
88
+ language.scripts.set(uri, document.getSnapshot(), document.languageId);
89
+ }
90
+ else {
91
+ language.scripts.delete(uri);
92
+ }
93
+ });
94
+ languageService = (0, language_service_1.createLanguageService)(language, server.languageServicePlugins, serviceEnv);
109
95
  }
96
+ return languageService;
110
97
  }
111
- };
98
+ }
112
99
  }
113
100
  exports.createHybridModeProjectProviderFactory = createHybridModeProjectProviderFactory;
114
101
  //# sourceMappingURL=hybridModeProject.js.map
package/lib/types.d.ts CHANGED
@@ -5,9 +5,5 @@ export type VueInitializationOptions = InitializationOptions & {
5
5
  };
6
6
  vue?: {
7
7
  hybridMode?: boolean;
8
- /**
9
- * @example ['vue1', 'vue2']
10
- */
11
- additionalExtensions?: string[];
12
8
  };
13
9
  };
package/node.d.ts CHANGED
@@ -1,11 +1,43 @@
1
1
  import type { Connection } from '@volar/language-server';
2
+ import { GetLanguagePlugin } from './lib/hybridModeProject';
2
3
  export declare const connection: Connection;
3
4
  export declare const server: {
4
- initialize: (params: Omit<import("@volar/language-server").InitializeParams, "initializationOptions"> & {
5
- initializationOptions?: import("@volar/language-server").InitializationOptions | undefined;
6
- }, projectProviderFactory: import("@volar/language-server").ServerProjectProviderFactory, _serverOptions: import("@volar/language-server/lib/server").ServerOptions) => Promise<import("@volar/language-server").InitializeResult<any>>;
5
+ 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
+ fs: import("@volar/language-server").FileSystem;
10
+ semanticTokensLegend: import("@volar/language-server").SemanticTokensLegend;
11
+ pullModelDiagnostics: boolean;
12
+ documents: import("@volar/language-server").TextDocuments<import("@volar/language-server/node").SnapshotDocument>;
13
+ workspaceFolders: {
14
+ clear: () => void;
15
+ values: () => IterableIterator<boolean>;
16
+ uriKeys: () => IterableIterator<string>;
17
+ uriDelete: (_uri: string) => boolean;
18
+ uriGet: (_uri: string) => boolean | undefined;
19
+ uriHas: (_uri: string) => boolean;
20
+ uriSet: (_uri: string, item: boolean) => void;
21
+ pathDelete: (path: string) => boolean;
22
+ pathGet: (path: string) => boolean | undefined;
23
+ pathHas: (path: string) => boolean | undefined;
24
+ pathSet: (path: string, item: boolean) => void;
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;
28
+ pullModelDiagnostics?: boolean | undefined;
29
+ } | undefined) => import("@volar/language-server").InitializeResult<any>;
7
30
  initialized: () => void;
8
- shutdown: () => void;
9
- readonly projects: import("@volar/language-server").ServerProjectProvider;
10
- readonly env: import("@volar/language-server").ServerRuntimeEnvironment;
31
+ shutdown: () => Promise<void>;
32
+ watchFiles: (patterns: string[]) => void;
33
+ getConfiguration: <T>(section: string, scopeUri?: string | undefined) => Promise<T | undefined>;
34
+ onDidChangeConfiguration: (cb: import("@volar/language-server").NotificationHandler<import("@volar/language-server").DidChangeConfigurationParams>) => {
35
+ dispose(): void;
36
+ };
37
+ onDidChangeWatchedFiles: (cb: import("@volar/language-server").NotificationHandler<import("@volar/language-server").DidChangeWatchedFilesParams>) => {
38
+ dispose: () => void;
39
+ };
40
+ clearPushDiagnostics: () => void;
41
+ refresh: (projects: import("@volar/language-server").ServerProjectProvider) => Promise<void>;
11
42
  };
43
+ export declare const getLanguagePlugins: GetLanguagePlugin;
package/node.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.server = exports.connection = void 0;
3
+ exports.getLanguagePlugins = 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");
@@ -8,80 +8,69 @@ const tsPluginClient = require("@vue/typescript-plugin/lib/client");
8
8
  const utils_1 = require("@vue/typescript-plugin/lib/utils");
9
9
  const hybridModeProject_1 = require("./lib/hybridModeProject");
10
10
  const protocol_1 = require("./lib/protocol");
11
- exports.connection = (0, node_1.createConnection)();
12
- exports.server = (0, node_1.createServer)(exports.connection);
13
- const envToVueOptions = new WeakMap();
14
11
  let tsdk;
12
+ let hybridMode;
15
13
  let getTsPluginClient;
14
+ const envToVueOptions = new WeakMap();
15
+ const watchedExtensions = new Set();
16
+ exports.connection = (0, node_1.createConnection)();
17
+ exports.server = (0, node_1.createServer)(exports.connection);
18
+ const getLanguagePlugins = async (serviceEnv, configFileName, host, sys) => {
19
+ const commandLine = await parseCommandLine();
20
+ 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
+ if (!hybridMode) {
23
+ const extensions = [
24
+ 'js', 'cjs', 'mjs', 'ts', 'cts', 'mts', 'jsx', 'tsx', 'json',
25
+ ...vueOptions.extensions.map(ext => ext.slice(1)),
26
+ ...vueOptions.vitePressExtensions.map(ext => ext.slice(1)),
27
+ ...vueOptions.petiteVueExtensions.map(ext => ext.slice(1)),
28
+ ];
29
+ const newExtensions = extensions.filter(ext => !watchedExtensions.has(ext));
30
+ if (newExtensions.length) {
31
+ for (const ext of newExtensions) {
32
+ watchedExtensions.add(ext);
33
+ }
34
+ exports.server.watchFiles(['**/*.{' + newExtensions.join(',') + '}']);
35
+ }
36
+ }
37
+ envToVueOptions.set(serviceEnv, vueOptions);
38
+ return [vueLanguagePlugin];
39
+ async function parseCommandLine() {
40
+ let commandLine;
41
+ let sysVersion;
42
+ if (sys) {
43
+ let newSysVersion = await sys.sync();
44
+ while (sysVersion !== newSysVersion) {
45
+ sysVersion = newSysVersion;
46
+ if (configFileName) {
47
+ commandLine = (0, language_core_1.createParsedCommandLine)(tsdk.typescript, sys, configFileName);
48
+ }
49
+ newSysVersion = await sys.sync();
50
+ }
51
+ }
52
+ return commandLine;
53
+ }
54
+ };
55
+ exports.getLanguagePlugins = getLanguagePlugins;
16
56
  exports.connection.listen();
17
- exports.connection.onInitialize(async (params) => {
57
+ exports.connection.onInitialize(params => {
18
58
  const options = params.initializationOptions;
19
- const hybridMode = options.vue?.hybridMode ?? true;
20
- const vueFileExtensions = ['vue'];
59
+ hybridMode = options.vue?.hybridMode ?? true;
21
60
  tsdk = (0, node_1.loadTsdkByPath)(options.typescript.tsdk, params.locale);
22
- if (options.vue?.additionalExtensions) {
23
- for (const additionalExtension of options.vue.additionalExtensions) {
24
- vueFileExtensions.push(additionalExtension);
25
- }
26
- }
27
61
  if (hybridMode) {
28
62
  getTsPluginClient = () => tsPluginClient;
29
63
  }
30
64
  else {
31
65
  getTsPluginClient = (0, language_service_1.createDefaultGetTsPluginClient)(tsdk.typescript, env => envToVueOptions.get(env));
32
66
  }
33
- const result = await exports.server.initialize(params, hybridMode
34
- ? (0, hybridModeProject_1.createHybridModeProjectProviderFactory)(tsdk.typescript.sys)
35
- : (0, node_1.createTypeScriptProjectProviderFactory)(tsdk.typescript, tsdk.diagnosticMessages), {
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
- },
51
- getServicePlugins() {
52
- return (0, language_service_1.createVueServicePlugins)(tsdk.typescript, env => envToVueOptions.get(env), getTsPluginClient, hybridMode);
53
- },
54
- async getLanguagePlugins(serviceEnv, projectContext) {
55
- const commandLine = await parseCommandLine();
56
- const vueOptions = commandLine?.vueOptions ?? (0, language_core_1.resolveVueCompilerOptions)({});
57
- for (const ext of vueFileExtensions) {
58
- if (!vueOptions.extensions.includes(`.${ext}`)) {
59
- vueOptions.extensions.push(`.${ext}`);
60
- }
61
- }
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);
63
- envToVueOptions.set(serviceEnv, vueOptions);
64
- return [vueLanguagePlugin];
65
- async function parseCommandLine() {
66
- let commandLine;
67
- if (projectContext.typescript) {
68
- const { sys } = projectContext.typescript;
69
- let sysVersion;
70
- let newSysVersion = await sys.sync();
71
- while (sysVersion !== newSysVersion) {
72
- sysVersion = newSysVersion;
73
- if (projectContext.typescript.configFileName) {
74
- commandLine = (0, language_core_1.createParsedCommandLine)(tsdk.typescript, sys, projectContext.typescript.configFileName);
75
- }
76
- newSysVersion = await sys.sync();
77
- }
78
- }
79
- return commandLine;
80
- }
81
- },
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)), {
70
+ pullModelDiagnostics: hybridMode,
82
71
  });
83
72
  if (hybridMode) {
84
- // handle by tsserver + @vue/typescript-plugin
73
+ // provided by tsserver + @vue/typescript-plugin
85
74
  result.capabilities.semanticTokensProvider = undefined;
86
75
  }
87
76
  return result;
@@ -98,7 +87,7 @@ exports.connection.onRequest(protocol_1.ParseSFCRequest.type, params => {
98
87
  exports.connection.onRequest(protocol_1.DetectNameCasingRequest.type, async (params) => {
99
88
  const languageService = await getService(params.textDocument.uri);
100
89
  if (languageService) {
101
- return await (0, language_service_1.detect)(languageService.context, params.textDocument.uri, getTsPluginClient(languageService.context));
90
+ return await (0, language_service_1.detect)(languageService.context, params.textDocument.uri);
102
91
  }
103
92
  });
104
93
  exports.connection.onRequest(protocol_1.GetConvertTagCasingEditsRequest.type, async (params) => {
@@ -120,6 +109,6 @@ exports.connection.onRequest(protocol_1.GetConnectedNamedPipeServerRequest.type,
120
109
  }
121
110
  });
122
111
  async function getService(uri) {
123
- return (await exports.server.projects.getProject(uri)).getLanguageService();
112
+ return (await exports.server.projects.get.call(exports.server, uri)).getLanguageService();
124
113
  }
125
114
  //# sourceMappingURL=node.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue/language-server",
3
- "version": "2.0.14",
3
+ "version": "2.0.16",
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.2.0-alpha.10",
19
- "@volar/language-server": "2.2.0-alpha.10",
20
- "@vue/language-core": "2.0.14",
21
- "@vue/language-service": "2.0.14",
22
- "@vue/typescript-plugin": "2.0.14",
18
+ "@volar/language-core": "~2.2.0",
19
+ "@volar/language-server": "~2.2.0",
20
+ "@vue/language-core": "2.0.16",
21
+ "@vue/language-service": "2.0.16",
22
+ "@vue/typescript-plugin": "2.0.16",
23
23
  "vscode-languageserver-protocol": "^3.17.5"
24
24
  },
25
- "gitHead": "ce1412067f88b7f9af03a2d3e04c220b4921c363"
25
+ "gitHead": "95b78c38cbf75481ebb59e11956b592346f01d92"
26
26
  }