@vue/typescript-plugin 2.0.10 → 2.0.12

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/index.js CHANGED
@@ -42,7 +42,7 @@ function createLanguageServicePlugin() {
42
42
  server_1.projects.set(info.project, { info, language, vueOptions });
43
43
  (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
44
44
  (0, common_1.decorateLanguageServiceForVue)(language, info.languageService, vueOptions, ts, true);
45
- (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost, getLanguageId);
45
+ (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
46
46
  (0, server_1.startNamedPipeServer)(ts, info.project.projectKind, info.project.getCurrentDirectory());
47
47
  }
48
48
  return info.languageService;
package/lib/client.js CHANGED
@@ -67,7 +67,7 @@ function getElementAttrs(...args) {
67
67
  }
68
68
  exports.getElementAttrs = getElementAttrs;
69
69
  async function sendRequest(request) {
70
- const server = await (0, utils_1.searchNamedPipeServerForFile)(request.args[0]);
70
+ const server = (await (0, utils_1.searchNamedPipeServerForFile)(request.args[0]))?.server;
71
71
  if (!server) {
72
72
  console.warn('[Vue Named Pipe Client] No server found for', request.args[0]);
73
73
  return;
package/lib/server.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type * as ts from 'typescript';
2
2
  import type { Language, VueCompilerOptions } from '@vue/language-core';
3
3
  export interface Request {
4
- type: 'containsFile' | 'collectExtractProps' | 'getImportPathForFile' | 'getPropertiesAtLocation' | 'getQuickInfoAtPosition' | 'getComponentProps' | 'getComponentEvents' | 'getTemplateContextProps' | 'getComponentNames' | 'getElementAttrs';
4
+ type: 'projectInfoForFile' | 'collectExtractProps' | 'getImportPathForFile' | 'getPropertiesAtLocation' | 'getQuickInfoAtPosition' | 'getComponentProps' | 'getComponentEvents' | 'getTemplateContextProps' | 'getComponentNames' | 'getElementAttrs';
5
5
  args: [fileName: string, ...rest: any];
6
6
  }
7
7
  export declare function startNamedPipeServer(ts: typeof import('typescript'), serverKind: ts.server.ProjectKind, currentDirectory: string): void;
package/lib/server.js CHANGED
@@ -24,8 +24,13 @@ function startNamedPipeServer(ts, serverKind, currentDirectory) {
24
24
  const request = JSON.parse(text);
25
25
  const fileName = request.args[0];
26
26
  const project = getProject(fileName);
27
- if (request.type === 'containsFile') {
28
- connection.write(JSON.stringify(!!project));
27
+ if (request.type === 'projectInfoForFile') {
28
+ connection.write(JSON.stringify(project
29
+ ? {
30
+ name: project.info.project.getProjectName(),
31
+ kind: project.info.project.projectKind,
32
+ }
33
+ : null));
29
34
  }
30
35
  else if (project) {
31
36
  const requestContext = {
package/lib/utils.d.ts CHANGED
@@ -10,5 +10,14 @@ export interface NamedPipeServer {
10
10
  export declare function readPipeTable(): NamedPipeServer[];
11
11
  export declare function updatePipeTable(servers: NamedPipeServer[]): void;
12
12
  export declare function connect(path: string): Promise<net.Socket | undefined>;
13
- export declare function searchNamedPipeServerForFile(fileName: string): Promise<NamedPipeServer | undefined>;
13
+ export declare function searchNamedPipeServerForFile(fileName: string): Promise<{
14
+ server: NamedPipeServer;
15
+ projectInfo: {
16
+ name: string;
17
+ kind: ts.server.ProjectKind;
18
+ };
19
+ } | {
20
+ server: NamedPipeServer;
21
+ projectInfo: undefined;
22
+ } | undefined>;
14
23
  export declare function sendRequestWorker<T>(request: Request, client: net.Socket): Promise<T | null | undefined>;
package/lib/utils.js CHANGED
@@ -33,12 +33,16 @@ exports.updatePipeTable = updatePipeTable;
33
33
  function connect(path) {
34
34
  return new Promise(resolve => {
35
35
  const client = net.connect(path);
36
+ client.setTimeout(1000);
36
37
  client.on('connect', () => {
37
38
  resolve(client);
38
39
  });
39
40
  client.on('error', () => {
40
41
  return resolve(undefined);
41
42
  });
43
+ client.on('timeout', () => {
44
+ return resolve(undefined);
45
+ });
42
46
  });
43
47
  }
44
48
  exports.connect = connect;
@@ -49,12 +53,15 @@ async function searchNamedPipeServerForFile(fileName) {
49
53
  const inferredServers = servers
50
54
  .filter(item => item.serverKind === 0)
51
55
  .sort((a, b) => b.currentDirectory.length - a.currentDirectory.length);
52
- for (const server of configuredServers) {
56
+ for (const server of configuredServers.sort((a, b) => sortTSConfigs(fileName, a.currentDirectory, b.currentDirectory))) {
53
57
  const client = await connect(server.path);
54
58
  if (client) {
55
- const response = await sendRequestWorker({ type: 'containsFile', args: [fileName] }, client);
56
- if (response) {
57
- return server;
59
+ const projectInfo = await sendRequestWorker({ type: 'projectInfoForFile', args: [fileName] }, client);
60
+ if (projectInfo) {
61
+ return {
62
+ server,
63
+ projectInfo,
64
+ };
58
65
  }
59
66
  }
60
67
  }
@@ -62,15 +69,35 @@ async function searchNamedPipeServerForFile(fileName) {
62
69
  if (!path.relative(server.currentDirectory, fileName).startsWith('..')) {
63
70
  const client = await connect(server.path);
64
71
  if (client) {
65
- return server;
72
+ return {
73
+ server,
74
+ projectInfo: undefined,
75
+ };
66
76
  }
67
77
  }
68
78
  }
69
79
  }
70
80
  exports.searchNamedPipeServerForFile = searchNamedPipeServerForFile;
81
+ function sortTSConfigs(file, a, b) {
82
+ const inA = isFileInDir(file, path.dirname(a));
83
+ const inB = isFileInDir(file, path.dirname(b));
84
+ if (inA !== inB) {
85
+ const aWeight = inA ? 1 : 0;
86
+ const bWeight = inB ? 1 : 0;
87
+ return bWeight - aWeight;
88
+ }
89
+ const aLength = a.split('/').length;
90
+ const bLength = b.split('/').length;
91
+ return bLength - aLength;
92
+ }
93
+ function isFileInDir(fileName, dir) {
94
+ const relative = path.relative(dir, fileName);
95
+ return !!relative && !relative.startsWith('..') && !path.isAbsolute(relative);
96
+ }
71
97
  function sendRequestWorker(request, client) {
72
98
  return new Promise(resolve => {
73
99
  let dataChunks = [];
100
+ client.setTimeout(5000);
74
101
  client.on('data', chunk => {
75
102
  dataChunks.push(chunk);
76
103
  });
@@ -93,6 +120,14 @@ function sendRequestWorker(request, client) {
93
120
  }
94
121
  resolve(json);
95
122
  });
123
+ client.on('error', err => {
124
+ console.error('[Vue Named Pipe Client] Error:', err.message);
125
+ resolve(undefined);
126
+ });
127
+ client.on('timeout', () => {
128
+ console.error('[Vue Named Pipe Client] Timeout');
129
+ resolve(undefined);
130
+ });
96
131
  client.write(JSON.stringify(request));
97
132
  });
98
133
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue/typescript-plugin",
3
- "version": "2.0.10",
3
+ "version": "2.0.12",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,12 +12,12 @@
12
12
  "directory": "packages/typescript-plugin"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/typescript": "~2.2.0-alpha.5",
16
- "@vue/language-core": "2.0.10",
15
+ "@volar/typescript": "2.2.0-alpha.7",
16
+ "@vue/language-core": "2.0.12",
17
17
  "@vue/shared": "^3.4.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/node": "latest"
21
21
  },
22
- "gitHead": "a20a2ee950b63a949660b7e8faf0faed0e5bad33"
22
+ "gitHead": "c1c4e1a2a6c32da59351641bd41bf7f5db0cac69"
23
23
  }