@vue/typescript-plugin 3.0.7-alpha.1 → 3.0.8
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 +76 -80
- package/lib/common.js +8 -10
- package/lib/requests/collectExtractProps.d.ts +1 -1
- package/lib/requests/collectExtractProps.js +2 -2
- package/lib/requests/getComponentEvents.js +2 -2
- package/lib/requests/getComponentNames.js +1 -1
- package/lib/requests/getComponentProps.js +2 -2
- package/lib/requests/getElementNames.js +1 -1
- package/lib/requests/getImportPathForFile.d.ts +1 -3
- package/lib/requests/getImportPathForFile.js +3 -5
- package/lib/requests/getReactiveReferences.d.ts +5 -0
- package/lib/requests/getReactiveReferences.js +54 -0
- package/lib/requests/index.d.ts +2 -1
- package/lib/requests/isRefAtPosition.d.ts +3 -0
- package/lib/requests/{getPropertiesAtLocation.js → isRefAtPosition.js} +12 -13
- package/package.json +4 -3
- package/lib/requests/getPropertiesAtLocation.d.ts +0 -3
- package/lib/requests/types.d.ts +0 -8
- package/lib/requests/types.js +0 -3
package/index.js
CHANGED
|
@@ -11,13 +11,14 @@ const getComponentSlots_1 = require("./lib/requests/getComponentSlots");
|
|
|
11
11
|
const getElementAttrs_1 = require("./lib/requests/getElementAttrs");
|
|
12
12
|
const getElementNames_1 = require("./lib/requests/getElementNames");
|
|
13
13
|
const getImportPathForFile_1 = require("./lib/requests/getImportPathForFile");
|
|
14
|
-
const
|
|
14
|
+
const getReactiveReferences_1 = require("./lib/requests/getReactiveReferences");
|
|
15
|
+
const isRefAtPosition_1 = require("./lib/requests/isRefAtPosition");
|
|
15
16
|
const windowsPathReg = /\\/g;
|
|
16
17
|
const project2Service = new WeakMap();
|
|
17
18
|
module.exports = (0, createLanguageServicePlugin_1.createLanguageServicePlugin)((ts, info) => {
|
|
18
19
|
const vueOptions = getVueCompilerOptions();
|
|
19
|
-
vue.writeGlobalTypes(vueOptions, ts.sys.writeFile);
|
|
20
20
|
const languagePlugin = vue.createVueLanguagePlugin(ts, info.languageServiceHost.getCompilationSettings(), vueOptions, id => id);
|
|
21
|
+
vue.writeGlobalTypes(vueOptions, ts.sys.writeFile);
|
|
21
22
|
addVueCommands();
|
|
22
23
|
return {
|
|
23
24
|
languagePlugins: [languagePlugin],
|
|
@@ -47,135 +48,130 @@ module.exports = (0, createLanguageServicePlugin_1.createLanguageServicePlugin)(
|
|
|
47
48
|
function addVueCommands() {
|
|
48
49
|
const projectService = info.project.projectService;
|
|
49
50
|
projectService.logger.info('Vue: called handler processing ' + info.project.projectKind);
|
|
50
|
-
|
|
51
|
-
if (!session) {
|
|
51
|
+
if (!info.session) {
|
|
52
52
|
projectService.logger.info('Vue: there is no session in info.');
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
|
+
const session = info.session;
|
|
55
56
|
if (!session.addProtocolHandler) {
|
|
56
57
|
// addProtocolHandler was introduced in TS 4.4 or 4.5 in 2021, see https://github.com/microsoft/TypeScript/issues/43893
|
|
57
58
|
projectService.logger.info('Vue: there is no addProtocolHandler method.');
|
|
58
59
|
return;
|
|
59
60
|
}
|
|
60
|
-
|
|
61
|
+
// @ts-expect-error
|
|
62
|
+
const handlers = session.handlers;
|
|
63
|
+
if (handlers.has('_vue:projectInfo')) {
|
|
61
64
|
return;
|
|
62
65
|
}
|
|
63
66
|
session.addProtocolHandler('_vue:projectInfo', request => {
|
|
64
|
-
return
|
|
67
|
+
return handlers.get('projectInfo')(request);
|
|
65
68
|
});
|
|
66
69
|
session.addProtocolHandler('_vue:documentHighlights-full', request => {
|
|
67
|
-
return
|
|
70
|
+
return handlers.get('documentHighlights-full')(request);
|
|
68
71
|
});
|
|
69
72
|
session.addProtocolHandler('_vue:encodedSemanticClassifications-full', request => {
|
|
70
|
-
return
|
|
73
|
+
return handlers.get('encodedSemanticClassifications-full')(request);
|
|
71
74
|
});
|
|
72
75
|
session.addProtocolHandler('_vue:quickinfo', request => {
|
|
73
|
-
return
|
|
76
|
+
return handlers.get('quickinfo')(request);
|
|
74
77
|
});
|
|
75
78
|
session.addProtocolHandler('_vue:collectExtractProps', request => {
|
|
76
79
|
const [fileName, templateCodeRange] = request.arguments;
|
|
77
|
-
const { language,
|
|
78
|
-
return
|
|
79
|
-
response: (0, collectExtractProps_1.collectExtractProps)(ts, language, program, sourceScript, virtualCode, templateCodeRange, true),
|
|
80
|
-
};
|
|
80
|
+
const { language, languageService, sourceScript, virtualCode } = getLanguageServiceAndVirtualCode(fileName);
|
|
81
|
+
return createResponse((0, collectExtractProps_1.collectExtractProps)(ts, language, languageService.getProgram(), sourceScript, virtualCode, templateCodeRange, sourceScript.generated ? sourceScript.snapshot.getLength() : 0));
|
|
81
82
|
});
|
|
82
83
|
session.addProtocolHandler('_vue:getImportPathForFile', request => {
|
|
83
84
|
const [fileName, incomingFileName, preferences] = request.arguments;
|
|
84
|
-
const { languageServiceHost,
|
|
85
|
-
return
|
|
86
|
-
response: (0, getImportPathForFile_1.getImportPathForFile)(ts, languageServiceHost, program, fileName, incomingFileName, preferences),
|
|
87
|
-
};
|
|
85
|
+
const { languageServiceHost, languageService } = getLanguageService(fileName);
|
|
86
|
+
return createResponse((0, getImportPathForFile_1.getImportPathForFile)(ts, languageServiceHost, languageService.getProgram(), fileName, incomingFileName, preferences));
|
|
88
87
|
});
|
|
89
|
-
session.addProtocolHandler('_vue:
|
|
88
|
+
session.addProtocolHandler('_vue:isRefAtPosition', request => {
|
|
90
89
|
const [fileName, position] = request.arguments;
|
|
91
|
-
const { language,
|
|
92
|
-
return
|
|
93
|
-
response: (0, getPropertiesAtLocation_1.getPropertiesAtLocation)(ts, language, program, sourceScript, virtualCode, position, true),
|
|
94
|
-
};
|
|
90
|
+
const { language, languageService, sourceScript, virtualCode } = getLanguageServiceAndVirtualCode(fileName);
|
|
91
|
+
return createResponse((0, isRefAtPosition_1.isRefAtPosition)(ts, language, languageService.getProgram(), sourceScript, virtualCode, position, sourceScript.generated ? sourceScript.snapshot.getLength() : 0));
|
|
95
92
|
});
|
|
96
93
|
session.addProtocolHandler('_vue:getComponentDirectives', request => {
|
|
97
94
|
const [fileName] = request.arguments;
|
|
98
|
-
const {
|
|
99
|
-
return
|
|
100
|
-
response: (0, getComponentDirectives_1.getComponentDirectives)(ts, program, fileName),
|
|
101
|
-
};
|
|
95
|
+
const { languageService } = getLanguageService(fileName);
|
|
96
|
+
return createResponse((0, getComponentDirectives_1.getComponentDirectives)(ts, languageService.getProgram(), fileName));
|
|
102
97
|
});
|
|
103
98
|
session.addProtocolHandler('_vue:getComponentEvents', request => {
|
|
104
99
|
const [fileName, tag] = request.arguments;
|
|
105
|
-
const {
|
|
106
|
-
return
|
|
107
|
-
response: (0, getComponentEvents_1.getComponentEvents)(ts, program, fileName, tag),
|
|
108
|
-
};
|
|
100
|
+
const { languageService } = getLanguageService(fileName);
|
|
101
|
+
return createResponse((0, getComponentEvents_1.getComponentEvents)(ts, languageService.getProgram(), fileName, tag));
|
|
109
102
|
});
|
|
110
103
|
session.addProtocolHandler('_vue:getComponentNames', request => {
|
|
111
104
|
const [fileName] = request.arguments;
|
|
112
|
-
const {
|
|
113
|
-
return
|
|
114
|
-
response: (0, getComponentNames_1.getComponentNames)(ts, program, fileName),
|
|
115
|
-
};
|
|
105
|
+
const { languageService } = getLanguageService(fileName);
|
|
106
|
+
return createResponse((0, getComponentNames_1.getComponentNames)(ts, languageService.getProgram(), fileName));
|
|
116
107
|
});
|
|
117
108
|
session.addProtocolHandler('_vue:getComponentProps', request => {
|
|
118
109
|
const [fileName, tag] = request.arguments;
|
|
119
|
-
const {
|
|
120
|
-
return
|
|
121
|
-
response: (0, getComponentProps_1.getComponentProps)(ts, program, fileName, tag),
|
|
122
|
-
};
|
|
110
|
+
const { languageService } = getLanguageService(fileName);
|
|
111
|
+
return createResponse((0, getComponentProps_1.getComponentProps)(ts, languageService.getProgram(), fileName, tag));
|
|
123
112
|
});
|
|
124
113
|
session.addProtocolHandler('_vue:getComponentSlots', request => {
|
|
125
114
|
const [fileName] = request.arguments;
|
|
126
|
-
const {
|
|
127
|
-
return
|
|
128
|
-
response: (0, getComponentSlots_1.getComponentSlots)(ts, program, virtualCode),
|
|
129
|
-
};
|
|
115
|
+
const { languageService, virtualCode } = getLanguageServiceAndVirtualCode(fileName);
|
|
116
|
+
return createResponse((0, getComponentSlots_1.getComponentSlots)(ts, languageService.getProgram(), virtualCode));
|
|
130
117
|
});
|
|
131
118
|
session.addProtocolHandler('_vue:getElementAttrs', request => {
|
|
132
119
|
const [fileName, tag] = request.arguments;
|
|
133
|
-
const {
|
|
134
|
-
return
|
|
135
|
-
response: (0, getElementAttrs_1.getElementAttrs)(ts, program, fileName, tag),
|
|
136
|
-
};
|
|
120
|
+
const { languageService } = getLanguageService(fileName);
|
|
121
|
+
return createResponse((0, getElementAttrs_1.getElementAttrs)(ts, languageService.getProgram(), fileName, tag));
|
|
137
122
|
});
|
|
138
123
|
session.addProtocolHandler('_vue:getElementNames', request => {
|
|
139
124
|
const [fileName] = request.arguments;
|
|
140
|
-
const {
|
|
141
|
-
return
|
|
142
|
-
|
|
143
|
-
|
|
125
|
+
const { languageService } = getLanguageService(fileName);
|
|
126
|
+
return createResponse((0, getElementNames_1.getElementNames)(ts, languageService.getProgram(), fileName));
|
|
127
|
+
});
|
|
128
|
+
session.addProtocolHandler('_vue:getReactiveReferences', request => {
|
|
129
|
+
const [fileName, position] = request.arguments;
|
|
130
|
+
const { language } = getLanguageService(fileName);
|
|
131
|
+
const sourceScript = language.scripts.get(fileName);
|
|
132
|
+
return createResponse((0, getReactiveReferences_1.getReactiveReferences)(ts, language, sourceScript, position, sourceScript.generated ? sourceScript.snapshot.getLength() : 0));
|
|
144
133
|
});
|
|
145
134
|
projectService.logger.info('Vue specific commands are successfully added.');
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
throw new Error('No source script found for file: ' + fileName);
|
|
135
|
+
function createResponse(res) {
|
|
136
|
+
return {
|
|
137
|
+
response: res,
|
|
138
|
+
responseRequired: true,
|
|
139
|
+
};
|
|
152
140
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
141
|
+
function getLanguageServiceAndVirtualCode(fileName) {
|
|
142
|
+
const service = getLanguageService(fileName);
|
|
143
|
+
const sourceScript = service.language.scripts.get(fileName);
|
|
144
|
+
if (!sourceScript) {
|
|
145
|
+
throw new Error('No source script found for file: ' + fileName);
|
|
146
|
+
}
|
|
147
|
+
const virtualCode = sourceScript.generated?.root;
|
|
148
|
+
if (!(virtualCode instanceof vue.VueVirtualCode)) {
|
|
149
|
+
throw new Error('No virtual code found for file: ' + fileName);
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
...service,
|
|
153
|
+
sourceScript,
|
|
154
|
+
virtualCode,
|
|
155
|
+
};
|
|
156
156
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
157
|
+
function getLanguageService(fileName) {
|
|
158
|
+
// @ts-expect-error
|
|
159
|
+
const { project } = session.getFileAndProject({
|
|
160
|
+
file: fileName,
|
|
161
|
+
projectFileName: undefined,
|
|
162
|
+
});
|
|
163
|
+
const service = project2Service.get(project);
|
|
164
|
+
if (!service) {
|
|
165
|
+
throw new Error('No vue service for project: ' + project.getProjectName());
|
|
166
|
+
}
|
|
167
|
+
const [language, languageServiceHost, languageService] = service;
|
|
168
|
+
return {
|
|
169
|
+
typescript: ts,
|
|
170
|
+
languageService,
|
|
171
|
+
languageServiceHost,
|
|
172
|
+
language,
|
|
173
|
+
};
|
|
171
174
|
}
|
|
172
|
-
const [language, languageServiceHost, languageService] = service;
|
|
173
|
-
return {
|
|
174
|
-
typescript: ts,
|
|
175
|
-
program: languageService.getProgram(),
|
|
176
|
-
languageServiceHost,
|
|
177
|
-
language,
|
|
178
|
-
};
|
|
179
175
|
}
|
|
180
176
|
});
|
|
181
177
|
//# sourceMappingURL=index.js.map
|
package/lib/common.js
CHANGED
|
@@ -20,14 +20,12 @@ function createVueLanguageServiceProxy(ts, language, languageService, vueOptions
|
|
|
20
20
|
};
|
|
21
21
|
return new Proxy(languageService, {
|
|
22
22
|
get(target, p, receiver) {
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return proxyMethod;
|
|
30
|
-
}
|
|
23
|
+
if (!proxyCache.has(p)) {
|
|
24
|
+
proxyCache.set(p, getProxyMethod(target, p));
|
|
25
|
+
}
|
|
26
|
+
const proxyMethod = proxyCache.get(p);
|
|
27
|
+
if (proxyMethod) {
|
|
28
|
+
return proxyMethod;
|
|
31
29
|
}
|
|
32
30
|
return Reflect.get(target, p, receiver);
|
|
33
31
|
},
|
|
@@ -127,8 +125,8 @@ function getCompletionEntryDetails(language, getCompletionEntryDetails) {
|
|
|
127
125
|
const { fileName } = args[6].__isAutoImport;
|
|
128
126
|
const sourceScript = language.scripts.get(fileName);
|
|
129
127
|
if (sourceScript?.generated?.root instanceof language_core_1.VueVirtualCode) {
|
|
130
|
-
const
|
|
131
|
-
if (!
|
|
128
|
+
const { vueSfc } = sourceScript.generated.root;
|
|
129
|
+
if (!vueSfc?.descriptor.script && !vueSfc?.descriptor.scriptSetup) {
|
|
132
130
|
for (const codeAction of details?.codeActions ?? []) {
|
|
133
131
|
for (const change of codeAction.changes) {
|
|
134
132
|
for (const textChange of change.textChanges) {
|
|
@@ -5,5 +5,5 @@ interface ExtractPropsInfo {
|
|
|
5
5
|
type: string;
|
|
6
6
|
model: boolean;
|
|
7
7
|
}
|
|
8
|
-
export declare function collectExtractProps(ts: typeof import('typescript'), language: Language, program: ts.Program, sourceScript: SourceScript, virtualCode: VueVirtualCode, templateCodeRange: [number, number],
|
|
8
|
+
export declare function collectExtractProps(ts: typeof import('typescript'), language: Language, program: ts.Program, sourceScript: SourceScript, virtualCode: VueVirtualCode, templateCodeRange: [number, number], leadingOffset?: number): ExtractPropsInfo[];
|
|
9
9
|
export {};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.collectExtractProps = collectExtractProps;
|
|
4
4
|
const language_core_1 = require("@vue/language-core");
|
|
5
|
-
function collectExtractProps(ts, language, program, sourceScript, virtualCode, templateCodeRange,
|
|
5
|
+
function collectExtractProps(ts, language, program, sourceScript, virtualCode, templateCodeRange, leadingOffset = 0) {
|
|
6
6
|
const result = new Map();
|
|
7
7
|
const sourceFile = program.getSourceFile(virtualCode.fileName);
|
|
8
8
|
const checker = program.getTypeChecker();
|
|
@@ -17,7 +17,7 @@ function collectExtractProps(ts, language, program, sourceScript, virtualCode, t
|
|
|
17
17
|
const { name } = node;
|
|
18
18
|
for (const map of maps) {
|
|
19
19
|
let mapped = false;
|
|
20
|
-
for (const source of map.toSourceLocation(name.getEnd() -
|
|
20
|
+
for (const source of map.toSourceLocation(name.getEnd() - leadingOffset)) {
|
|
21
21
|
if (source[0] >= sfc.template.startTagEnd + templateCodeRange[0]
|
|
22
22
|
&& source[0] <= sfc.template.startTagEnd + templateCodeRange[1]
|
|
23
23
|
&& (0, language_core_1.isSemanticTokensEnabled)(source[1].data)) {
|
|
@@ -25,8 +25,8 @@ function getComponentEvents(ts, program, fileName, tag) {
|
|
|
25
25
|
if (emitSymbol) {
|
|
26
26
|
const emitType = checker.getTypeOfSymbolAtLocation(emitSymbol, components.node);
|
|
27
27
|
for (const call of emitType.getCallSignatures()) {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
if (call.parameters.length) {
|
|
29
|
+
const eventNameParamSymbol = call.parameters[0];
|
|
30
30
|
const eventNameParamType = checker.getTypeOfSymbolAtLocation(eventNameParamSymbol, components.node);
|
|
31
31
|
if (eventNameParamType.isStringLiteral()) {
|
|
32
32
|
result.add(eventNameParamType.value);
|
|
@@ -5,7 +5,7 @@ const utils_1 = require("./utils");
|
|
|
5
5
|
function getComponentNames(ts, program, fileName) {
|
|
6
6
|
const names = (0, utils_1.getVariableType)(ts, program, fileName, '__VLS_components')
|
|
7
7
|
?.type
|
|
8
|
-
|
|
8
|
+
.getProperties()
|
|
9
9
|
.map(c => c.name)
|
|
10
10
|
.filter(entry => !entry.includes('$') && !entry.startsWith('_'))
|
|
11
11
|
?? [];
|
|
@@ -14,8 +14,8 @@ function getComponentProps(ts, program, fileName, tag) {
|
|
|
14
14
|
const result = new Map();
|
|
15
15
|
const checker = program.getTypeChecker();
|
|
16
16
|
for (const sig of componentType.getCallSignatures()) {
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
if (sig.parameters.length) {
|
|
18
|
+
const propParam = sig.parameters[0];
|
|
19
19
|
const propsType = checker.getTypeOfSymbolAtLocation(propParam, components.node);
|
|
20
20
|
const props = propsType.getProperties();
|
|
21
21
|
for (const prop of props) {
|
|
@@ -1,4 +1,2 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
|
-
export declare function getImportPathForFile(ts: typeof import('typescript'), languageServiceHost: ts.LanguageServiceHost, program: ts.Program, fileName: string, incomingFileName: string, preferences: ts.UserPreferences):
|
|
3
|
-
path?: string;
|
|
4
|
-
};
|
|
2
|
+
export declare function getImportPathForFile(ts: typeof import('typescript'), languageServiceHost: ts.LanguageServiceHost, program: ts.Program, fileName: string, incomingFileName: string, preferences: ts.UserPreferences): string | undefined;
|
|
@@ -4,14 +4,12 @@ exports.getImportPathForFile = getImportPathForFile;
|
|
|
4
4
|
function getImportPathForFile(ts, languageServiceHost, program, fileName, incomingFileName, preferences) {
|
|
5
5
|
const incomingFile = program.getSourceFile(incomingFileName);
|
|
6
6
|
const sourceFile = program.getSourceFile(fileName);
|
|
7
|
-
if (!
|
|
8
|
-
return
|
|
7
|
+
if (!sourceFile || !incomingFile) {
|
|
8
|
+
return;
|
|
9
9
|
}
|
|
10
10
|
const getModuleSpecifiersWithCacheInfo = ts.moduleSpecifiers.getModuleSpecifiersWithCacheInfo;
|
|
11
11
|
const resolutionHost = ts.createModuleSpecifierResolutionHost(program, languageServiceHost);
|
|
12
12
|
const { moduleSpecifiers } = getModuleSpecifiersWithCacheInfo(incomingFile.symbol, program.getTypeChecker(), languageServiceHost.getCompilationSettings(), sourceFile, resolutionHost, preferences);
|
|
13
|
-
return
|
|
14
|
-
path: moduleSpecifiers[0],
|
|
15
|
-
};
|
|
13
|
+
return moduleSpecifiers[0];
|
|
16
14
|
}
|
|
17
15
|
//# sourceMappingURL=getImportPathForFile.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Language, type SourceScript } from '@vue/language-core';
|
|
2
|
+
export declare function getReactiveReferences(ts: typeof import('typescript'), language: Language<string>, sourceScript: SourceScript<string>, position: number, leadingOffset?: number): {
|
|
3
|
+
dependencyRanges: ts.TextRange[];
|
|
4
|
+
dependentRanges: ts.TextRange[];
|
|
5
|
+
} | undefined;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getReactiveReferences = getReactiveReferences;
|
|
4
|
+
const typescript_1 = require("@volar/typescript");
|
|
5
|
+
const laplacenoma_1 = require("laplacenoma");
|
|
6
|
+
const rulesVue = require("laplacenoma/rules/vue");
|
|
7
|
+
const analyzer = (0, laplacenoma_1.createAnalyzer)({
|
|
8
|
+
rules: rulesVue,
|
|
9
|
+
});
|
|
10
|
+
let currentVersion = -1;
|
|
11
|
+
let currentFileName = '';
|
|
12
|
+
let currentSnapshot;
|
|
13
|
+
let languageService;
|
|
14
|
+
let languageServiceHost;
|
|
15
|
+
function getReactiveReferences(ts, language, sourceScript, position, leadingOffset = 0) {
|
|
16
|
+
if (currentSnapshot !== sourceScript.snapshot || currentFileName !== sourceScript.id) {
|
|
17
|
+
currentSnapshot = sourceScript.snapshot;
|
|
18
|
+
currentFileName = sourceScript.id;
|
|
19
|
+
currentVersion++;
|
|
20
|
+
}
|
|
21
|
+
if (!languageService) {
|
|
22
|
+
languageServiceHost = {
|
|
23
|
+
getProjectVersion: () => currentVersion.toString(),
|
|
24
|
+
getScriptVersion: () => currentVersion.toString(),
|
|
25
|
+
getScriptFileNames: () => [currentFileName],
|
|
26
|
+
getScriptSnapshot: fileName => fileName === currentFileName ? currentSnapshot : undefined,
|
|
27
|
+
getCompilationSettings: () => ({ allowJs: true, allowNonTsExtensions: true }),
|
|
28
|
+
getCurrentDirectory: () => '',
|
|
29
|
+
getDefaultLibFileName: () => '',
|
|
30
|
+
readFile: () => undefined,
|
|
31
|
+
fileExists: fileName => fileName === currentFileName,
|
|
32
|
+
};
|
|
33
|
+
(0, typescript_1.decorateLanguageServiceHost)(ts, language, languageServiceHost);
|
|
34
|
+
const proxied = (0, typescript_1.createProxyLanguageService)(ts.createLanguageService(languageServiceHost));
|
|
35
|
+
proxied.initialize(language);
|
|
36
|
+
languageService = proxied.proxy;
|
|
37
|
+
}
|
|
38
|
+
const sourceFile = languageService.getProgram().getSourceFile(sourceScript.id);
|
|
39
|
+
const serviceScript = sourceScript.generated?.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
40
|
+
const map = serviceScript ? language.maps.get(serviceScript.code, sourceScript) : undefined;
|
|
41
|
+
const toSourceRange = map
|
|
42
|
+
? (pos, end) => {
|
|
43
|
+
for (const [mappedStart, mappedEnd] of map.toSourceRange(pos - leadingOffset, end - leadingOffset, false)) {
|
|
44
|
+
return { pos: mappedStart, end: mappedEnd };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
: (pos, end) => ({ pos, end });
|
|
48
|
+
return analyzer.analyze(sourceFile, position, {
|
|
49
|
+
typescript: ts,
|
|
50
|
+
languageService,
|
|
51
|
+
toSourceRange,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=getReactiveReferences.js.map
|
package/lib/requests/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ type Response<T> = T | null | undefined | Promise<T | null | undefined>;
|
|
|
3
3
|
export interface Requests {
|
|
4
4
|
collectExtractProps(fileName: string, templateCodeRange: [number, number]): Response<ReturnType<typeof import('./collectExtractProps.js')['collectExtractProps']>>;
|
|
5
5
|
getImportPathForFile(fileName: string, incomingFileName: string, preferences: ts.UserPreferences): Response<ReturnType<typeof import('./getImportPathForFile.js')['getImportPathForFile']>>;
|
|
6
|
-
|
|
6
|
+
isRefAtPosition(fileName: string, position: number): Response<ReturnType<typeof import('./isRefAtPosition.js')['isRefAtPosition']>>;
|
|
7
7
|
getComponentDirectives(fileName: string): Response<ReturnType<typeof import('./getComponentDirectives.js')['getComponentDirectives']>>;
|
|
8
8
|
getComponentEvents(fileName: string, tag: string): Response<ReturnType<typeof import('./getComponentEvents.js')['getComponentEvents']>>;
|
|
9
9
|
getComponentNames(fileName: string): Response<ReturnType<typeof import('./getComponentNames.js')['getComponentNames']>>;
|
|
@@ -11,6 +11,7 @@ export interface Requests {
|
|
|
11
11
|
getComponentSlots(fileName: string): Response<ReturnType<typeof import('./getComponentSlots.js')['getComponentSlots']>>;
|
|
12
12
|
getElementAttrs(fileName: string, tag: string): Response<ReturnType<typeof import('./getElementAttrs.js')['getElementAttrs']>>;
|
|
13
13
|
getElementNames(fileName: string): Response<ReturnType<typeof import('./getElementNames.js')['getElementNames']>>;
|
|
14
|
+
getReactiveReferences(fileName: string, position: number): Response<ReturnType<typeof import('./getReactiveReferences.js')['getReactiveReferences']>>;
|
|
14
15
|
getDocumentHighlights(fileName: string, position: number): Response<ts.DocumentHighlights[]>;
|
|
15
16
|
getEncodedSemanticClassifications(fileName: string, span: ts.TextSpan): Response<ts.Classifications>;
|
|
16
17
|
getQuickInfoAtPosition(fileName: string, position: ts.LineAndCharacter): Response<string>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type Language, type SourceScript, type VueVirtualCode } from '@vue/language-core';
|
|
2
|
+
import type * as ts from 'typescript';
|
|
3
|
+
export declare function isRefAtPosition(ts: typeof import('typescript'), language: Language, program: ts.Program, sourceScript: SourceScript, virtualCode: VueVirtualCode, position: number, leadingOffset?: number): boolean;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/// <reference types="@volar/typescript" />
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
4
|
+
exports.isRefAtPosition = isRefAtPosition;
|
|
5
5
|
const language_core_1 = require("@vue/language-core");
|
|
6
|
-
function
|
|
7
|
-
const
|
|
8
|
-
if (!
|
|
9
|
-
return
|
|
6
|
+
function isRefAtPosition(ts, language, program, sourceScript, virtualCode, position, leadingOffset = 0) {
|
|
7
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(virtualCode);
|
|
8
|
+
if (!serviceScript) {
|
|
9
|
+
return false;
|
|
10
10
|
}
|
|
11
11
|
let mapped = false;
|
|
12
|
-
for (const [_sourceScript, map] of language.maps.forEach(
|
|
12
|
+
for (const [_sourceScript, map] of language.maps.forEach(serviceScript.code)) {
|
|
13
13
|
for (const [position2, mapping] of map.toGeneratedLocation(position)) {
|
|
14
14
|
if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
|
|
15
15
|
position = position2;
|
|
@@ -22,21 +22,20 @@ function getPropertiesAtLocation(ts, language, program, sourceScript, virtualCod
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
if (!mapped) {
|
|
25
|
-
return
|
|
25
|
+
return false;
|
|
26
26
|
}
|
|
27
|
-
position += isTsPlugin ? sourceScript.snapshot.getLength() : 0;
|
|
28
27
|
const sourceFile = program.getSourceFile(virtualCode.fileName);
|
|
29
28
|
if (!sourceFile) {
|
|
30
|
-
return
|
|
29
|
+
return false;
|
|
31
30
|
}
|
|
32
|
-
const node = findPositionIdentifier(sourceFile, sourceFile, position);
|
|
31
|
+
const node = findPositionIdentifier(sourceFile, sourceFile, position + leadingOffset);
|
|
33
32
|
if (!node) {
|
|
34
|
-
return
|
|
33
|
+
return false;
|
|
35
34
|
}
|
|
36
35
|
const checker = program.getTypeChecker();
|
|
37
36
|
const type = checker.getTypeAtLocation(node);
|
|
38
37
|
const props = type.getProperties();
|
|
39
|
-
return props.
|
|
38
|
+
return props.some(prop => prop.escapedName === 'value' && prop.flags & ts.SymbolFlags.Accessor);
|
|
40
39
|
function findPositionIdentifier(sourceFile, node, offset) {
|
|
41
40
|
let result;
|
|
42
41
|
node.forEachChild(child => {
|
|
@@ -52,4 +51,4 @@ function getPropertiesAtLocation(ts, language, program, sourceScript, virtualCod
|
|
|
52
51
|
return result;
|
|
53
52
|
}
|
|
54
53
|
}
|
|
55
|
-
//# sourceMappingURL=
|
|
54
|
+
//# sourceMappingURL=isRefAtPosition.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vue/typescript-plugin",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.8",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -14,13 +14,14 @@
|
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"@volar/typescript": "2.4.23",
|
|
17
|
-
"@vue/language-core": "3.0.
|
|
17
|
+
"@vue/language-core": "3.0.8",
|
|
18
18
|
"@vue/shared": "^3.5.0",
|
|
19
|
+
"laplacenoma": "^0.0.3",
|
|
19
20
|
"path-browserify": "^1.0.1"
|
|
20
21
|
},
|
|
21
22
|
"devDependencies": {
|
|
22
23
|
"@types/node": "^22.10.4",
|
|
23
24
|
"@types/path-browserify": "^1.0.1"
|
|
24
25
|
},
|
|
25
|
-
"gitHead": "
|
|
26
|
+
"gitHead": "f7bdeaa7bb476df1fc8ff46c504d75c1869b0be9"
|
|
26
27
|
}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { type Language, type SourceScript, type VueVirtualCode } from '@vue/language-core';
|
|
2
|
-
import type * as ts from 'typescript';
|
|
3
|
-
export declare function getPropertiesAtLocation(ts: typeof import('typescript'), language: Language, program: ts.Program, sourceScript: SourceScript, virtualCode: VueVirtualCode, position: number, isTsPlugin: boolean): string[];
|
package/lib/requests/types.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Language } from '@vue/language-core';
|
|
2
|
-
import type * as ts from 'typescript';
|
|
3
|
-
export interface RequestContext {
|
|
4
|
-
typescript: typeof ts;
|
|
5
|
-
languageService: ts.LanguageService;
|
|
6
|
-
languageServiceHost: ts.LanguageServiceHost;
|
|
7
|
-
language: Language<string>;
|
|
8
|
-
}
|
package/lib/requests/types.js
DELETED