@vue/language-service 1.7.8 → 1.7.9
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/data/template/en.json +8 -0
- package/data/template/fr.json +8 -0
- package/data/template/ja.json +8 -0
- package/data/template/ko.json +8 -0
- package/data/template/zh-cn.json +8 -0
- package/out/ideFeatures/nameCasing.d.ts +2 -1
- package/out/ideFeatures/nameCasing.js +13 -20
- package/out/languageService.js +11 -9
- package/out/plugins/data.js +0 -9
- package/out/plugins/vue-autoinsert-dotvalue.js +3 -6
- package/out/plugins/vue-template.js +21 -14
- package/out/plugins/vue-twoslash-queries.js +3 -5
- package/out/plugins/vue.js +2 -3
- package/package.json +15 -14
- package/data/language-blocks/zh-tw.json +0 -626
- package/data/model-modifiers/zh-tw.json +0 -104
- package/data/template/zh-tw.json +0 -866
package/out/languageService.js
CHANGED
|
@@ -37,12 +37,13 @@ function resolvePlugins(services, vueCompilerOptions, settings) {
|
|
|
37
37
|
if (!_context || !modules?.typescript)
|
|
38
38
|
return base;
|
|
39
39
|
const ts = modules.typescript;
|
|
40
|
-
const
|
|
40
|
+
const transformedItem = new WeakSet();
|
|
41
41
|
return {
|
|
42
42
|
...base,
|
|
43
|
-
|
|
44
|
-
if (
|
|
45
|
-
return
|
|
43
|
+
transformCompletionItem(item) {
|
|
44
|
+
if (transformedItem.has(item)) {
|
|
45
|
+
return item;
|
|
46
|
+
}
|
|
46
47
|
},
|
|
47
48
|
async provideCompletionItems(document, position, context, item) {
|
|
48
49
|
const result = await base.provideCompletionItems?.(document, position, context, item);
|
|
@@ -86,7 +87,6 @@ function resolvePlugins(services, vueCompilerOptions, settings) {
|
|
|
86
87
|
for (const ext of vueCompilerOptions.extensions) {
|
|
87
88
|
const suffix = (0, shared_1.capitalize)(ext.substring('.'.length)); // .vue -> Vue
|
|
88
89
|
if (itemData?.uri
|
|
89
|
-
&& _context.typescript
|
|
90
90
|
&& item.textEdit?.newText.endsWith(suffix)
|
|
91
91
|
&& item.additionalTextEdits?.length === 1 && item.additionalTextEdits[0].newText.indexOf('import ' + item.textEdit.newText + ' from ') >= 0
|
|
92
92
|
&& (await _context.env.getConfiguration?.('vue.complete.normalizeComponentImportName') ?? true)) {
|
|
@@ -119,6 +119,7 @@ function resolvePlugins(services, vueCompilerOptions, settings) {
|
|
|
119
119
|
}
|
|
120
120
|
const data = item.data;
|
|
121
121
|
if (item.data?.__isComponentAutoImport && data && item.additionalTextEdits?.length && item.textEdit) {
|
|
122
|
+
let transformed = false;
|
|
122
123
|
for (const [_, map] of _context.documents.getMapsByVirtualFileUri(data.uri)) {
|
|
123
124
|
const virtualFile = _context.documents.getSourceByUri(map.sourceFileDocument.uri)?.root;
|
|
124
125
|
if (virtualFile instanceof vue.VueFile) {
|
|
@@ -144,8 +145,7 @@ function resolvePlugins(services, vueCompilerOptions, settings) {
|
|
|
144
145
|
start: textDoc.positionAt(sfc.script.startTagEnd + exportDefault.componentsOption.start),
|
|
145
146
|
end: textDoc.positionAt(sfc.script.startTagEnd + exportDefault.componentsOption.end),
|
|
146
147
|
};
|
|
147
|
-
|
|
148
|
-
autoImportPositions.add(editRange.end);
|
|
148
|
+
transformed = true;
|
|
149
149
|
item.additionalTextEdits.push({
|
|
150
150
|
range: editRange,
|
|
151
151
|
newText: unescape(printText.replace(/\\u/g, '%u')),
|
|
@@ -164,8 +164,7 @@ function resolvePlugins(services, vueCompilerOptions, settings) {
|
|
|
164
164
|
start: textDoc.positionAt(sfc.script.startTagEnd + exportDefault.args.start),
|
|
165
165
|
end: textDoc.positionAt(sfc.script.startTagEnd + exportDefault.args.end),
|
|
166
166
|
};
|
|
167
|
-
|
|
168
|
-
autoImportPositions.add(editRange.end);
|
|
167
|
+
transformed = true;
|
|
169
168
|
item.additionalTextEdits.push({
|
|
170
169
|
range: editRange,
|
|
171
170
|
newText: unescape(printText.replace(/\\u/g, '%u')),
|
|
@@ -175,6 +174,9 @@ function resolvePlugins(services, vueCompilerOptions, settings) {
|
|
|
175
174
|
}
|
|
176
175
|
}
|
|
177
176
|
}
|
|
177
|
+
if (transformed) {
|
|
178
|
+
transformedItem.add(item);
|
|
179
|
+
}
|
|
178
180
|
}
|
|
179
181
|
return item;
|
|
180
182
|
},
|
package/out/plugins/data.js
CHANGED
|
@@ -16,9 +16,6 @@ function loadTemplateData(lang) {
|
|
|
16
16
|
else if (lang === 'zh-cn') {
|
|
17
17
|
data = require('../../data/template/zh-cn.json');
|
|
18
18
|
}
|
|
19
|
-
else if (lang === 'zh-tw') {
|
|
20
|
-
data = require('../../data/template/zh-tw.json');
|
|
21
|
-
}
|
|
22
19
|
else {
|
|
23
20
|
data = require('../../data/template/en.json');
|
|
24
21
|
}
|
|
@@ -54,9 +51,6 @@ function loadLanguageBlocks(lang) {
|
|
|
54
51
|
else if (lang === 'zh-cn') {
|
|
55
52
|
data = require('../../data/language-blocks/zh-cn.json');
|
|
56
53
|
}
|
|
57
|
-
else if (lang === 'zh-tw') {
|
|
58
|
-
data = require('../../data/language-blocks/zh-tw.json');
|
|
59
|
-
}
|
|
60
54
|
else {
|
|
61
55
|
data = require('../../data/language-blocks/en.json');
|
|
62
56
|
}
|
|
@@ -78,9 +72,6 @@ function loadModelModifiersData(lang) {
|
|
|
78
72
|
else if (lang === 'zh-cn') {
|
|
79
73
|
data = require('../../data/model-modifiers/zh-cn.json');
|
|
80
74
|
}
|
|
81
|
-
else if (lang === 'zh-tw') {
|
|
82
|
-
data = require('../../data/model-modifiers/zh-tw.json');
|
|
83
|
-
}
|
|
84
75
|
else {
|
|
85
76
|
data = require('../../data/model-modifiers/en.json');
|
|
86
77
|
}
|
|
@@ -5,10 +5,7 @@ const shared_1 = require("@vue/shared");
|
|
|
5
5
|
const plugin = (context, modules) => {
|
|
6
6
|
if (!modules?.typescript)
|
|
7
7
|
return {};
|
|
8
|
-
if (!context?.typescript)
|
|
9
|
-
return {};
|
|
10
8
|
const ts = modules.typescript;
|
|
11
|
-
const _ts = context.typescript;
|
|
12
9
|
return {
|
|
13
10
|
async provideAutoInsertionEdit(document, position, insertContext) {
|
|
14
11
|
if (!isTsDocument(document))
|
|
@@ -18,7 +15,7 @@ const plugin = (context, modules) => {
|
|
|
18
15
|
const enabled = await context.env.getConfiguration?.('vue.autoInsert.dotValue') ?? true;
|
|
19
16
|
if (!enabled)
|
|
20
17
|
return;
|
|
21
|
-
const program =
|
|
18
|
+
const program = context.inject('typescript/languageService').getProgram();
|
|
22
19
|
if (!program)
|
|
23
20
|
return;
|
|
24
21
|
const sourceFile = program.getSourceFile(context.env.uriToFileName(document.uri));
|
|
@@ -29,9 +26,9 @@ const plugin = (context, modules) => {
|
|
|
29
26
|
const node = findPositionIdentifier(sourceFile, sourceFile, document.offsetAt(position));
|
|
30
27
|
if (!node)
|
|
31
28
|
return;
|
|
32
|
-
const token =
|
|
29
|
+
const token = context.inject('typescript/languageServiceHost').getCancellationToken?.();
|
|
33
30
|
if (token) {
|
|
34
|
-
|
|
31
|
+
context.inject('typescript/languageService').getQuickInfoAtPosition(context.env.uriToFileName(document.uri), node.end);
|
|
35
32
|
if (token?.isCancellationRequested()) {
|
|
36
33
|
return; // check cancel here because type checker do not use cancel token
|
|
37
34
|
}
|
|
@@ -15,7 +15,7 @@ exports.default = (options) => (_context, modules) => {
|
|
|
15
15
|
...htmlOrPugService.triggerCharacters ?? [],
|
|
16
16
|
'@', // vue event shorthand
|
|
17
17
|
];
|
|
18
|
-
if (!_context
|
|
18
|
+
if (!_context || !modules?.typescript)
|
|
19
19
|
return { triggerCharacters };
|
|
20
20
|
builtInData ??= (0, data_1.loadTemplateData)(_context.env.locale ?? 'en');
|
|
21
21
|
modelData ??= (0, data_1.loadModelModifiersData)(_context.env.locale ?? 'en');
|
|
@@ -48,7 +48,6 @@ exports.default = (options) => (_context, modules) => {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
const ts = modules.typescript;
|
|
51
|
-
const _ts = _context.typescript;
|
|
52
51
|
return {
|
|
53
52
|
...htmlOrPugService,
|
|
54
53
|
triggerCharacters,
|
|
@@ -78,6 +77,8 @@ exports.default = (options) => (_context, modules) => {
|
|
|
78
77
|
const enabled = await _context.env.getConfiguration?.('vue.inlayHints.missingProps') ?? false;
|
|
79
78
|
if (!enabled)
|
|
80
79
|
return;
|
|
80
|
+
const languageService = _context.inject('typescript/languageService');
|
|
81
|
+
const languageServiceHost = _context.inject('typescript/languageServiceHost');
|
|
81
82
|
const result = [];
|
|
82
83
|
for (const [_, map] of _context.documents.getMapsByVirtualFileUri(document.uri)) {
|
|
83
84
|
const virtualFile = _context.documents.getSourceByUri(map.sourceFileDocument.uri)?.root;
|
|
@@ -85,8 +86,8 @@ exports.default = (options) => (_context, modules) => {
|
|
|
85
86
|
if (virtualFile && virtualFile instanceof vue.VueFile && scanner) {
|
|
86
87
|
// visualize missing required props
|
|
87
88
|
const casing = await (0, nameCasing_1.getNameCasing)(ts, _context, map.sourceFileDocument.uri);
|
|
88
|
-
const nativeTags = (0, helpers_1.checkNativeTags)(ts,
|
|
89
|
-
const components = (0, helpers_1.checkComponentNames)(ts,
|
|
89
|
+
const nativeTags = (0, helpers_1.checkNativeTags)(ts, languageService, languageServiceHost);
|
|
90
|
+
const components = (0, helpers_1.checkComponentNames)(ts, languageService, virtualFile, nativeTags);
|
|
90
91
|
const componentProps = {};
|
|
91
92
|
let token;
|
|
92
93
|
let current;
|
|
@@ -98,7 +99,7 @@ exports.default = (options) => (_context, modules) => {
|
|
|
98
99
|
: components.find(component => component === tagName || (0, shared_1.hyphenate)(component) === tagName);
|
|
99
100
|
const checkTag = tagName.indexOf('.') >= 0 ? tagName : component;
|
|
100
101
|
if (checkTag) {
|
|
101
|
-
componentProps[checkTag] ??= (0, helpers_1.checkPropsOfTag)(ts,
|
|
102
|
+
componentProps[checkTag] ??= (0, helpers_1.checkPropsOfTag)(ts, languageService, virtualFile, checkTag, nativeTags, true);
|
|
102
103
|
current = {
|
|
103
104
|
unburnedRequiredProps: [...componentProps[checkTag]],
|
|
104
105
|
labelOffset: scanner.getTokenOffset() + scanner.getTokenLength(),
|
|
@@ -225,12 +226,14 @@ exports.default = (options) => (_context, modules) => {
|
|
|
225
226
|
const scanner = options.getScanner(htmlOrPugService, document);
|
|
226
227
|
if (!scanner)
|
|
227
228
|
return;
|
|
229
|
+
const languageService = _context.inject('typescript/languageService');
|
|
230
|
+
const languageServiceHost = _context.inject('typescript/languageServiceHost');
|
|
228
231
|
for (const [_, map] of _context.documents.getMapsByVirtualFileUri(document.uri)) {
|
|
229
232
|
const virtualFile = _context.documents.getSourceByUri(map.sourceFileDocument.uri)?.root;
|
|
230
233
|
if (!virtualFile || !(virtualFile instanceof vue.VueFile))
|
|
231
234
|
continue;
|
|
232
|
-
const nativeTags = (0, helpers_1.checkNativeTags)(ts,
|
|
233
|
-
const templateScriptData = (0, helpers_1.checkComponentNames)(ts,
|
|
235
|
+
const nativeTags = (0, helpers_1.checkNativeTags)(ts, languageService, languageServiceHost);
|
|
236
|
+
const templateScriptData = (0, helpers_1.checkComponentNames)(ts, languageService, virtualFile, nativeTags);
|
|
234
237
|
const components = new Set([
|
|
235
238
|
...templateScriptData,
|
|
236
239
|
...templateScriptData.map(shared_1.hyphenate),
|
|
@@ -266,6 +269,8 @@ exports.default = (options) => (_context, modules) => {
|
|
|
266
269
|
},
|
|
267
270
|
};
|
|
268
271
|
async function provideHtmlData(map, vueSourceFile) {
|
|
272
|
+
const languageService = _context.inject('typescript/languageService');
|
|
273
|
+
const languageServiceHost = _context.inject('typescript/languageServiceHost');
|
|
269
274
|
const casing = await (0, nameCasing_1.getNameCasing)(ts, _context, map.sourceFileDocument.uri);
|
|
270
275
|
if (builtInData.tags) {
|
|
271
276
|
for (const tag of builtInData.tags) {
|
|
@@ -283,14 +288,14 @@ exports.default = (options) => (_context, modules) => {
|
|
|
283
288
|
}
|
|
284
289
|
}
|
|
285
290
|
}
|
|
286
|
-
const nativeTags = (0, helpers_1.checkNativeTags)(ts,
|
|
291
|
+
const nativeTags = (0, helpers_1.checkNativeTags)(ts, languageService, languageServiceHost);
|
|
287
292
|
options.updateCustomData(htmlOrPugService, [
|
|
288
293
|
html.newHTMLDataProvider('vue-template-built-in', builtInData),
|
|
289
294
|
{
|
|
290
295
|
getId: () => 'vue-template',
|
|
291
296
|
isApplicable: () => true,
|
|
292
297
|
provideTags: () => {
|
|
293
|
-
const components = (0, helpers_1.checkComponentNames)(ts,
|
|
298
|
+
const components = (0, helpers_1.checkComponentNames)(ts, languageService, vueSourceFile, nativeTags)
|
|
294
299
|
.filter(name => name !== 'Transition'
|
|
295
300
|
&& name !== 'TransitionGroup'
|
|
296
301
|
&& name !== 'KeepAlive'
|
|
@@ -325,9 +330,9 @@ exports.default = (options) => (_context, modules) => {
|
|
|
325
330
|
return tags;
|
|
326
331
|
},
|
|
327
332
|
provideAttributes: (tag) => {
|
|
328
|
-
const attrs = (0, helpers_1.getElementAttrs)(ts,
|
|
329
|
-
const props = new Set((0, helpers_1.checkPropsOfTag)(ts,
|
|
330
|
-
const events = (0, helpers_1.checkEventsOfTag)(ts,
|
|
333
|
+
const attrs = (0, helpers_1.getElementAttrs)(ts, languageService, languageServiceHost, tag);
|
|
334
|
+
const props = new Set((0, helpers_1.checkPropsOfTag)(ts, languageService, vueSourceFile, tag, nativeTags));
|
|
335
|
+
const events = (0, helpers_1.checkEventsOfTag)(ts, languageService, vueSourceFile, tag, nativeTags);
|
|
331
336
|
const attributes = [];
|
|
332
337
|
for (const prop of [...props, ...attrs]) {
|
|
333
338
|
const isGlobal = !props.has(prop);
|
|
@@ -405,9 +410,11 @@ exports.default = (options) => (_context, modules) => {
|
|
|
405
410
|
]);
|
|
406
411
|
}
|
|
407
412
|
function afterHtmlCompletion(completionList, map, vueSourceFile) {
|
|
413
|
+
const languageService = _context.inject('typescript/languageService');
|
|
414
|
+
const languageServiceHost = _context.inject('typescript/languageServiceHost');
|
|
408
415
|
const replacement = getReplacement(completionList, map.sourceFileDocument);
|
|
409
|
-
const nativeTags = (0, helpers_1.checkNativeTags)(ts,
|
|
410
|
-
const componentNames = new Set((0, helpers_1.checkComponentNames)(ts,
|
|
416
|
+
const nativeTags = (0, helpers_1.checkNativeTags)(ts, languageService, languageServiceHost);
|
|
417
|
+
const componentNames = new Set((0, helpers_1.checkComponentNames)(ts, languageService, vueSourceFile, nativeTags).map(shared_1.hyphenate));
|
|
411
418
|
if (replacement) {
|
|
412
419
|
const isEvent = replacement.text.startsWith('v-on:') || replacement.text.startsWith('@');
|
|
413
420
|
const isProp = replacement.text.startsWith('v-bind:') || replacement.text.startsWith(':');
|
|
@@ -3,17 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const language_service_1 = require("@volar/language-service");
|
|
4
4
|
const vue = require("@vue/language-core");
|
|
5
5
|
const plugin = (context, modules) => {
|
|
6
|
-
if (!modules?.typescript)
|
|
7
|
-
return {};
|
|
8
|
-
if (!context?.typescript)
|
|
6
|
+
if (!context || !modules?.typescript)
|
|
9
7
|
return {};
|
|
10
8
|
const ts = modules.typescript;
|
|
11
|
-
const _ts = context.typescript;
|
|
12
9
|
return {
|
|
13
10
|
provideInlayHints(document, range) {
|
|
14
11
|
return worker(document.uri, (vueFile) => {
|
|
15
12
|
const hoverOffsets = [];
|
|
16
13
|
const inlayHints = [];
|
|
14
|
+
const languageService = context.inject('typescript/languageService');
|
|
17
15
|
for (const pointer of document.getText(range).matchAll(/<!--\s*\^\?\s*-->/g)) {
|
|
18
16
|
const offset = pointer.index + pointer[0].indexOf('^?') + document.offsetAt(range.start);
|
|
19
17
|
const position = document.positionAt(offset);
|
|
@@ -28,7 +26,7 @@ const plugin = (context, modules) => {
|
|
|
28
26
|
for (const [pointerPosition, hoverOffset] of hoverOffsets) {
|
|
29
27
|
for (const [tsOffset, mapping] of map.map.toGeneratedOffsets(hoverOffset)) {
|
|
30
28
|
if (mapping.data.hover) {
|
|
31
|
-
const quickInfo =
|
|
29
|
+
const quickInfo = languageService.getQuickInfoAtPosition(embedded.fileName, tsOffset);
|
|
32
30
|
if (quickInfo) {
|
|
33
31
|
inlayHints.push({
|
|
34
32
|
position: { line: pointerPosition.line, character: pointerPosition.character + 2 },
|
package/out/plugins/vue.js
CHANGED
|
@@ -7,11 +7,10 @@ const data_1 = require("./data");
|
|
|
7
7
|
let sfcDataProvider;
|
|
8
8
|
exports.default = () => (context, modules) => {
|
|
9
9
|
const htmlPlugin = (0, volar_service_html_1.default)({ validLang: 'vue', disableCustomData: true })(context, modules);
|
|
10
|
-
if (!context
|
|
10
|
+
if (!context)
|
|
11
11
|
return htmlPlugin;
|
|
12
12
|
sfcDataProvider ??= html.newHTMLDataProvider('vue', (0, data_1.loadLanguageBlocks)(context.env.locale ?? 'en'));
|
|
13
13
|
htmlPlugin.provide['html/languageService']().setDataProviders(false, [sfcDataProvider]);
|
|
14
|
-
const _ts = context.typescript;
|
|
15
14
|
return {
|
|
16
15
|
...htmlPlugin,
|
|
17
16
|
provide: {
|
|
@@ -25,7 +24,7 @@ exports.default = () => (context, modules) => {
|
|
|
25
24
|
return worker(document, (vueSourceFile) => {
|
|
26
25
|
const result = [];
|
|
27
26
|
const sfc = vueSourceFile.sfc;
|
|
28
|
-
const program =
|
|
27
|
+
const program = context.inject('typescript/languageService').getProgram();
|
|
29
28
|
if (program && !program.getSourceFile(vueSourceFile.mainScriptName)) {
|
|
30
29
|
for (const script of [sfc.script, sfc.scriptSetup]) {
|
|
31
30
|
if (!script || script.content === '')
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vue/language-service",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.9",
|
|
4
4
|
"main": "out/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -17,27 +17,28 @@
|
|
|
17
17
|
"update-html-data": "node ./scripts/update-html-data.js"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@volar/language-core": "1.
|
|
21
|
-
"@volar/language-service": "1.
|
|
20
|
+
"@volar/language-core": "1.7.3",
|
|
21
|
+
"@volar/language-service": "1.7.3",
|
|
22
|
+
"@volar/typescript": "1.7.3",
|
|
22
23
|
"@vue/compiler-dom": "^3.3.0",
|
|
23
|
-
"@vue/language-core": "1.7.
|
|
24
|
+
"@vue/language-core": "1.7.9",
|
|
24
25
|
"@vue/reactivity": "^3.3.0",
|
|
25
26
|
"@vue/shared": "^3.3.0",
|
|
26
|
-
"volar-service-css": "0.0.
|
|
27
|
-
"volar-service-emmet": "0.0.
|
|
28
|
-
"volar-service-html": "0.0.
|
|
29
|
-
"volar-service-json": "0.0.
|
|
30
|
-
"volar-service-pug": "0.0.
|
|
31
|
-
"volar-service-pug-beautify": "0.0.
|
|
32
|
-
"volar-service-typescript": "0.0.
|
|
33
|
-
"volar-service-typescript-twoslash-queries": "0.0.
|
|
27
|
+
"volar-service-css": "0.0.7",
|
|
28
|
+
"volar-service-emmet": "0.0.7",
|
|
29
|
+
"volar-service-html": "0.0.7",
|
|
30
|
+
"volar-service-json": "0.0.7",
|
|
31
|
+
"volar-service-pug": "0.0.7",
|
|
32
|
+
"volar-service-pug-beautify": "0.0.7",
|
|
33
|
+
"volar-service-typescript": "0.0.7",
|
|
34
|
+
"volar-service-typescript-twoslash-queries": "0.0.7",
|
|
34
35
|
"vscode-html-languageservice": "^5.0.4",
|
|
35
36
|
"vscode-languageserver-textdocument": "^1.0.8"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
|
-
"@volar/kit": "1.
|
|
39
|
+
"@volar/kit": "1.7.3",
|
|
39
40
|
"vscode-languageserver-protocol": "^3.17.3",
|
|
40
41
|
"vscode-uri": "^3.0.7"
|
|
41
42
|
},
|
|
42
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "70f9ebedbc55a8d342ec425cc483dfe39c4b7489"
|
|
43
44
|
}
|