@vue/typescript-plugin 2.0.19 → 2.0.21
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.d.ts +2 -3
- package/index.js +34 -90
- package/lib/common.d.ts +3 -5
- package/lib/common.js +3 -2
- package/lib/requests/collectExtractProps.js +24 -19
- package/lib/requests/componentInfos.d.ts +4 -24
- package/lib/requests/getPropertiesAtLocation.js +1 -1
- package/lib/requests/types.d.ts +3 -3
- package/lib/server.d.ts +1 -1
- package/lib/utils.d.ts +1 -0
- package/lib/utils.js +1 -0
- package/package.json +4 -4
package/index.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export = _default;
|
|
1
|
+
declare const plugin: import("typescript").server.PluginModuleFactory;
|
|
2
|
+
export = plugin;
|
package/index.js
CHANGED
|
@@ -1,100 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const
|
|
3
|
-
const decorateLanguageServiceHost_1 = require("@volar/typescript/lib/node/decorateLanguageServiceHost");
|
|
2
|
+
const createLanguageServicePlugin_1 = require("@volar/typescript/lib/quickstart/createLanguageServicePlugin");
|
|
4
3
|
const vue = require("@vue/language-core");
|
|
5
|
-
const language_core_1 = require("@vue/language-core");
|
|
6
4
|
const common_1 = require("./lib/common");
|
|
7
5
|
const server_1 = require("./lib/server");
|
|
8
6
|
const windowsPathReg = /\\/g;
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
syncedScriptVersions.set(fileName, version);
|
|
34
|
-
const snapshot = getScriptSnapshot(fileName);
|
|
35
|
-
if (snapshot) {
|
|
36
|
-
language.scripts.set(fileName, snapshot);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
language.scripts.delete(fileName);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
projectExternalFileExtensions.set(info.project, extensions);
|
|
43
|
-
server_1.projects.set(info.project, { info, language, vueOptions });
|
|
44
|
-
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
45
|
-
(0, common_1.decorateLanguageServiceForVue)(language, info.languageService, vueOptions, ts, true, fileName => fileName);
|
|
46
|
-
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
47
|
-
(0, server_1.startNamedPipeServer)(ts, info.project.projectKind, info.project.getCurrentDirectory());
|
|
48
|
-
// #3963
|
|
49
|
-
const timer = setInterval(() => {
|
|
50
|
-
if (info.project['program']) {
|
|
51
|
-
clearInterval(timer);
|
|
52
|
-
info.project['program'].__vue__ = { language };
|
|
53
|
-
}
|
|
54
|
-
}, 50);
|
|
7
|
+
const plugin = (0, createLanguageServicePlugin_1.createLanguageServicePlugin)((ts, info) => {
|
|
8
|
+
const vueOptions = getVueCompilerOptions();
|
|
9
|
+
const languagePlugin = vue.createVueLanguagePlugin(ts, id => id, () => info.languageServiceHost.getProjectVersion?.() ?? '', info.project.projectKind === ts.server.ProjectKind.Inferred
|
|
10
|
+
? () => true
|
|
11
|
+
: fileName => {
|
|
12
|
+
const fileMap = new vue.FileMap(info.languageServiceHost.useCaseSensitiveFileNames?.() ?? false);
|
|
13
|
+
for (const vueFileName of createLanguageServicePlugin_1.externalFiles.get(info.project) ?? []) {
|
|
14
|
+
fileMap.set(vueFileName, undefined);
|
|
15
|
+
}
|
|
16
|
+
return fileMap.has(fileName);
|
|
17
|
+
}, info.languageServiceHost.getCompilationSettings(), vueOptions);
|
|
18
|
+
return {
|
|
19
|
+
languagePlugins: [languagePlugin],
|
|
20
|
+
setup: language => {
|
|
21
|
+
server_1.projects.set(info.project, { info, language, vueOptions });
|
|
22
|
+
(0, common_1.decorateLanguageServiceForVue)(language, info.languageService, vueOptions, ts, true, fileName => fileName);
|
|
23
|
+
(0, server_1.startNamedPipeServer)(ts, info.project.projectKind, info.project.getCurrentDirectory());
|
|
24
|
+
// #3963
|
|
25
|
+
const timer = setInterval(() => {
|
|
26
|
+
if (info.project['program']) {
|
|
27
|
+
clearInterval(timer);
|
|
28
|
+
info.project['program'].__vue__ = { language };
|
|
55
29
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (info.project.projectKind === ts.server.ProjectKind.Configured) {
|
|
59
|
-
const tsconfig = info.project.getProjectName();
|
|
60
|
-
return vue.createParsedCommandLine(ts, ts.sys, tsconfig.replace(windowsPathReg, '/')).vueOptions;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
return vue.createParsedCommandLineByJson(ts, ts.sys, info.languageServiceHost.getCurrentDirectory(), {}).vueOptions;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
getExternalFiles(project, updateLevel = 0) {
|
|
68
|
-
if (updateLevel >= (1)
|
|
69
|
-
|| !externalFiles.has(project)) {
|
|
70
|
-
const oldFiles = externalFiles.get(project);
|
|
71
|
-
const newFiles = new Set((0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, projectExternalFileExtensions.get(project)));
|
|
72
|
-
externalFiles.set(project, newFiles);
|
|
73
|
-
if (oldFiles && !twoSetsEqual(oldFiles, newFiles)) {
|
|
74
|
-
for (const oldFile of oldFiles) {
|
|
75
|
-
if (!newFiles.has(oldFile)) {
|
|
76
|
-
server_1.projects.get(project)?.language.scripts.delete(oldFile);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
project.refreshDiagnostics();
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return [...externalFiles.get(project)];
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
return pluginModule;
|
|
30
|
+
}, 50);
|
|
31
|
+
}
|
|
86
32
|
};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
return false;
|
|
33
|
+
function getVueCompilerOptions() {
|
|
34
|
+
if (info.project.projectKind === ts.server.ProjectKind.Configured) {
|
|
35
|
+
const tsconfig = info.project.getProjectName();
|
|
36
|
+
return vue.createParsedCommandLine(ts, ts.sys, tsconfig.replace(windowsPathReg, '/')).vueOptions;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return vue.createParsedCommandLineByJson(ts, ts.sys, info.languageServiceHost.getCurrentDirectory(), {}).vueOptions;
|
|
95
40
|
}
|
|
96
41
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
module.exports = createLanguageServicePlugin();
|
|
42
|
+
});
|
|
43
|
+
module.exports = plugin;
|
|
100
44
|
//# sourceMappingURL=index.js.map
|
package/lib/common.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import * as vue from '@vue/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
|
|
4
|
-
export declare function
|
|
5
|
-
|
|
6
|
-
languageService: ts.LanguageService;
|
|
7
|
-
}, vueCode: vue.VueVirtualCode, template: NonNullable<vue.VueVirtualCode['sfc']['template']>, spanTemplateRange: ts.TextSpan): ts.TextSpan[];
|
|
3
|
+
import type { RequestContext } from './requests/types';
|
|
4
|
+
export declare function decorateLanguageServiceForVue<T>(language: vue.Language<T>, languageService: ts.LanguageService, vueOptions: vue.VueCompilerOptions, ts: typeof import('typescript'), isTsPlugin: boolean, getScriptId: (fileName: string) => T): void;
|
|
5
|
+
export declare function getComponentSpans(this: Pick<RequestContext, 'typescript' | 'languageService'>, vueCode: vue.VueVirtualCode, template: NonNullable<vue.VueVirtualCode['sfc']['template']>, spanTemplateRange: ts.TextSpan): ts.TextSpan[];
|
package/lib/common.js
CHANGED
|
@@ -134,11 +134,12 @@ function decorateLanguageServiceForVue(language, languageService, vueOptions, ts
|
|
|
134
134
|
if (file?.generated?.root instanceof vue.VueVirtualCode) {
|
|
135
135
|
const { template } = file.generated.root.sfc;
|
|
136
136
|
if (template) {
|
|
137
|
-
for (const componentSpan of getComponentSpans.call({ typescript: ts, languageService
|
|
137
|
+
for (const componentSpan of getComponentSpans.call({ typescript: ts, languageService }, file.generated.root, template, {
|
|
138
138
|
start: span.start - template.startTagEnd,
|
|
139
139
|
length: span.length,
|
|
140
140
|
})) {
|
|
141
|
-
result.spans.push(componentSpan.start + template.startTagEnd, componentSpan.length, 256
|
|
141
|
+
result.spans.push(componentSpan.start + template.startTagEnd, componentSpan.length, 256 // class
|
|
142
|
+
);
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
}
|
|
@@ -16,7 +16,7 @@ function collectExtractProps(fileName, templateCodeRange) {
|
|
|
16
16
|
const sourceFile = program.getSourceFile(fileName);
|
|
17
17
|
const checker = program.getTypeChecker();
|
|
18
18
|
const script = volarFile.generated?.languagePlugin.typescript?.getServiceScript(volarFile.generated.root);
|
|
19
|
-
const maps = script ? [...language.maps.forEach(script.code).
|
|
19
|
+
const maps = script ? [...language.maps.forEach(script.code)].map(([_1, _2, map]) => map) : [];
|
|
20
20
|
const sfc = volarFile.generated.root.sfc;
|
|
21
21
|
sourceFile.forEachChild(function visit(node) {
|
|
22
22
|
if (ts.isPropertyAccessExpression(node)
|
|
@@ -24,25 +24,30 @@ function collectExtractProps(fileName, templateCodeRange) {
|
|
|
24
24
|
&& node.expression.text === '__VLS_ctx'
|
|
25
25
|
&& ts.isIdentifier(node.name)) {
|
|
26
26
|
const { name } = node;
|
|
27
|
-
for (const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
name
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
27
|
+
for (const map of maps) {
|
|
28
|
+
let mapped = false;
|
|
29
|
+
for (const source of map.getSourceOffsets(name.getEnd() - (isTsPlugin ? volarFile.snapshot.getLength() : 0))) {
|
|
30
|
+
if (source[0] >= sfc.template.startTagEnd + templateCodeRange[0]
|
|
31
|
+
&& source[0] <= sfc.template.startTagEnd + templateCodeRange[1]
|
|
32
|
+
&& (0, language_core_1.isSemanticTokensEnabled)(source[1].data)) {
|
|
33
|
+
mapped = true;
|
|
34
|
+
if (!result.has(name.text)) {
|
|
35
|
+
const type = checker.getTypeAtLocation(node);
|
|
36
|
+
const typeString = checker.typeToString(type, node, ts.TypeFormatFlags.NoTruncation);
|
|
37
|
+
result.set(name.text, {
|
|
38
|
+
name: name.text,
|
|
39
|
+
type: typeString.includes('__VLS_') ? 'any' : typeString,
|
|
40
|
+
model: false,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const isModel = ts.isPostfixUnaryExpression(node.parent) || ts.isBinaryExpression(node.parent);
|
|
44
|
+
if (isModel) {
|
|
45
|
+
result.get(name.text).model = true;
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
45
48
|
}
|
|
49
|
+
}
|
|
50
|
+
if (mapped) {
|
|
46
51
|
break;
|
|
47
52
|
}
|
|
48
53
|
}
|
|
@@ -2,28 +2,8 @@ import * as vue from '@vue/language-core';
|
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
3
|
import type { RequestContext } from './types';
|
|
4
4
|
export declare function getComponentProps(this: RequestContext, fileName: string, tag: string, requiredOnly?: boolean): string[] | undefined;
|
|
5
|
-
export declare function getComponentEvents(this:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
language: vue.Language;
|
|
9
|
-
getFileId: (fileName: string) => string;
|
|
10
|
-
}, fileName: string, tag: string): string[] | undefined;
|
|
11
|
-
export declare function getTemplateContextProps(this: {
|
|
12
|
-
typescript: typeof import('typescript');
|
|
13
|
-
languageService: ts.LanguageService;
|
|
14
|
-
language: vue.Language;
|
|
15
|
-
getFileId: (fileName: string) => string;
|
|
16
|
-
}, fileName: string): string[] | undefined;
|
|
17
|
-
export declare function getComponentNames(this: {
|
|
18
|
-
typescript: typeof import('typescript');
|
|
19
|
-
languageService: ts.LanguageService;
|
|
20
|
-
language: vue.Language;
|
|
21
|
-
getFileId: (fileName: string) => string;
|
|
22
|
-
}, fileName: string): string[] | undefined;
|
|
5
|
+
export declare function getComponentEvents(this: RequestContext, fileName: string, tag: string): string[] | undefined;
|
|
6
|
+
export declare function getTemplateContextProps(this: RequestContext, fileName: string): string[] | undefined;
|
|
7
|
+
export declare function getComponentNames(this: RequestContext, fileName: string): string[] | undefined;
|
|
23
8
|
export declare function _getComponentNames(ts: typeof import('typescript'), tsLs: ts.LanguageService, vueCode: vue.VueVirtualCode): string[];
|
|
24
|
-
export declare function getElementAttrs(this:
|
|
25
|
-
typescript: typeof import('typescript');
|
|
26
|
-
languageService: ts.LanguageService;
|
|
27
|
-
language: vue.Language;
|
|
28
|
-
getFileId: (fileName: string) => string;
|
|
29
|
-
}, fileName: string, tagName: string): string[] | undefined;
|
|
9
|
+
export declare function getElementAttrs(this: RequestContext, fileName: string, tagName: string): string[] | undefined;
|
|
@@ -12,7 +12,7 @@ function getPropertiesAtLocation(fileName, position) {
|
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
14
|
let mapped = false;
|
|
15
|
-
for (const [_1,
|
|
15
|
+
for (const [_1, _2, map] of language.maps.forEach(virtualScript.code)) {
|
|
16
16
|
for (const [position2, mapping] of map.getGeneratedOffsets(position)) {
|
|
17
17
|
if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
|
|
18
18
|
position = position2;
|
package/lib/requests/types.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Language } from '@vue/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export interface RequestContext {
|
|
3
|
+
export interface RequestContext<T = any> {
|
|
4
4
|
typescript: typeof import('typescript');
|
|
5
5
|
languageService: ts.LanguageService;
|
|
6
6
|
languageServiceHost: ts.LanguageServiceHost;
|
|
7
|
-
language: Language
|
|
7
|
+
language: Language<T>;
|
|
8
8
|
isTsPlugin: boolean;
|
|
9
|
-
getFileId: (fileName: string) =>
|
|
9
|
+
getFileId: (fileName: string) => T;
|
|
10
10
|
}
|
package/lib/server.d.ts
CHANGED
|
@@ -7,6 +7,6 @@ export interface Request {
|
|
|
7
7
|
export declare function startNamedPipeServer(ts: typeof import('typescript'), serverKind: ts.server.ProjectKind, currentDirectory: string): void;
|
|
8
8
|
export declare const projects: Map<ts.server.Project, {
|
|
9
9
|
info: ts.server.PluginCreateInfo;
|
|
10
|
-
language: Language
|
|
10
|
+
language: Language<string>;
|
|
11
11
|
vueOptions: VueCompilerOptions;
|
|
12
12
|
}>;
|
package/lib/utils.d.ts
CHANGED
package/lib/utils.js
CHANGED
|
@@ -5,6 +5,7 @@ const os = require("os");
|
|
|
5
5
|
const net = require("net");
|
|
6
6
|
const path = require("path");
|
|
7
7
|
const fs = require("fs");
|
|
8
|
+
var typescript_1 = require("@volar/typescript");
|
|
8
9
|
const { version } = require('../package.json');
|
|
9
10
|
const pipeTableFile = path.join(os.tmpdir(), `vue-tsp-table-${version}.json`);
|
|
10
11
|
function readPipeTable() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vue/typescript-plugin",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.21",
|
|
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.
|
|
16
|
-
"@vue/language-core": "2.0.
|
|
15
|
+
"@volar/typescript": "~2.3.0-alpha.15",
|
|
16
|
+
"@vue/language-core": "2.0.21",
|
|
17
17
|
"@vue/shared": "^3.4.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@types/node": "latest"
|
|
21
21
|
},
|
|
22
|
-
"gitHead": "
|
|
22
|
+
"gitHead": "a5af80e3939a39694abd9dd09a5496bc5fbf6e06"
|
|
23
23
|
}
|