@vue/language-service 2.2.8 → 3.0.0-alpha.2
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/language-blocks/ko.json +6 -6
- package/data/template/ko.json +26 -26
- package/index.d.ts +6 -5
- package/index.js +32 -20
- package/lib/ideFeatures/nameCasing.js +6 -6
- package/lib/nameCasing.d.ts +14 -0
- package/lib/nameCasing.js +201 -0
- package/lib/plugins/vue-autoinsert-dotvalue.d.ts +1 -1
- package/lib/plugins/vue-compiler-dom-errors.d.ts +2 -0
- package/lib/plugins/vue-compiler-dom-errors.js +68 -0
- package/lib/plugins/vue-document-drop.d.ts +1 -1
- package/lib/plugins/vue-document-highlights.d.ts +3 -0
- package/lib/plugins/vue-document-highlights.js +46 -0
- package/lib/plugins/vue-extract-file.d.ts +1 -1
- package/lib/plugins/vue-missing-props-hints.d.ts +3 -0
- package/lib/plugins/vue-missing-props-hints.js +160 -0
- package/lib/plugins/vue-template.d.ts +1 -1
- package/lib/plugins/vue-template.js +2 -234
- package/lib/plugins/vue-twoslash-queries.d.ts +1 -1
- package/lib/plugins/vue-twoslash-queries.js +1 -1
- package/package.json +4 -4
- package/lib/plugins/vue-template/autoinsert-self-closing-tags.d.ts +0 -6
- package/lib/plugins/vue-template/autoinsert-self-closing-tags.js +0 -39
- package/lib/plugins/vue-template/autoinsert-selfClosingTags.d.ts +0 -1
- package/lib/plugins/vue-template/autoinsert-selfClosingTags.js +0 -3
- package/lib/plugins/vue-template/autoinsert-selfclosing-tags.d.ts +0 -1
- package/lib/plugins/vue-template/autoinsert-selfclosing-tags.js +0 -3
package/index.js
CHANGED
|
@@ -19,7 +19,7 @@ exports.getFullLanguageServicePlugins = getFullLanguageServicePlugins;
|
|
|
19
19
|
exports.getHybridModeLanguageServicePlugins = getHybridModeLanguageServicePlugins;
|
|
20
20
|
__exportStar(require("@volar/language-service"), exports);
|
|
21
21
|
__exportStar(require("@vue/language-core"), exports);
|
|
22
|
-
__exportStar(require("./lib/
|
|
22
|
+
__exportStar(require("./lib/nameCasing"), exports);
|
|
23
23
|
__exportStar(require("./lib/types"), exports);
|
|
24
24
|
const types_1 = require("./lib/types");
|
|
25
25
|
const volar_service_emmet_1 = require("volar-service-emmet");
|
|
@@ -32,12 +32,15 @@ const syntactic_1 = require("volar-service-typescript/lib/plugins/syntactic");
|
|
|
32
32
|
const css_1 = require("./lib/plugins/css");
|
|
33
33
|
const vue_autoinsert_dotvalue_1 = require("./lib/plugins/vue-autoinsert-dotvalue");
|
|
34
34
|
const vue_autoinsert_space_1 = require("./lib/plugins/vue-autoinsert-space");
|
|
35
|
+
const vue_compiler_dom_errors_1 = require("./lib/plugins/vue-compiler-dom-errors");
|
|
35
36
|
const vue_complete_define_assignment_1 = require("./lib/plugins/vue-complete-define-assignment");
|
|
36
37
|
const vue_directive_comments_1 = require("./lib/plugins/vue-directive-comments");
|
|
37
38
|
const vue_document_drop_1 = require("./lib/plugins/vue-document-drop");
|
|
39
|
+
const vue_document_highlights_1 = require("./lib/plugins/vue-document-highlights");
|
|
38
40
|
const vue_document_links_1 = require("./lib/plugins/vue-document-links");
|
|
39
41
|
const vue_extract_file_1 = require("./lib/plugins/vue-extract-file");
|
|
40
42
|
const vue_inlayhints_1 = require("./lib/plugins/vue-inlayhints");
|
|
43
|
+
const vue_missing_props_hints_1 = require("./lib/plugins/vue-missing-props-hints");
|
|
41
44
|
const vue_sfc_1 = require("./lib/plugins/vue-sfc");
|
|
42
45
|
const vue_template_1 = require("./lib/plugins/vue-template");
|
|
43
46
|
const vue_twoslash_queries_1 = require("./lib/plugins/vue-twoslash-queries");
|
|
@@ -49,14 +52,15 @@ const getComponentEvents_1 = require("@vue/typescript-plugin/lib/requests/getCom
|
|
|
49
52
|
const getComponentNames_1 = require("@vue/typescript-plugin/lib/requests/getComponentNames");
|
|
50
53
|
const getComponentProps_1 = require("@vue/typescript-plugin/lib/requests/getComponentProps");
|
|
51
54
|
const getElementAttrs_1 = require("@vue/typescript-plugin/lib/requests/getElementAttrs");
|
|
55
|
+
const getElementNames_1 = require("@vue/typescript-plugin/lib/requests/getElementNames");
|
|
52
56
|
const getImportPathForFile_1 = require("@vue/typescript-plugin/lib/requests/getImportPathForFile");
|
|
53
57
|
const getPropertiesAtLocation_1 = require("@vue/typescript-plugin/lib/requests/getPropertiesAtLocation");
|
|
54
58
|
const vscode_uri_1 = require("vscode-uri");
|
|
55
|
-
const nameCasing_1 = require("./lib/
|
|
56
|
-
function getFullLanguageServicePlugins(ts
|
|
59
|
+
const nameCasing_1 = require("./lib/nameCasing");
|
|
60
|
+
function getFullLanguageServicePlugins(ts) {
|
|
57
61
|
const plugins = [
|
|
58
|
-
...(0, volar_service_typescript_1.create)(ts
|
|
59
|
-
...getCommonLanguageServicePlugins(ts, getTsPluginClientForLSP)
|
|
62
|
+
...(0, volar_service_typescript_1.create)(ts),
|
|
63
|
+
...getCommonLanguageServicePlugins(ts, getTsPluginClientForLSP),
|
|
60
64
|
];
|
|
61
65
|
for (let i = 0; i < plugins.length; i++) {
|
|
62
66
|
const plugin = plugins[i];
|
|
@@ -74,6 +78,7 @@ function getFullLanguageServicePlugins(ts, { disableAutoImportCache } = {}) {
|
|
|
74
78
|
languageService.getCompletionsAtPosition = proxy.getCompletionsAtPosition;
|
|
75
79
|
languageService.getCompletionEntryDetails = proxy.getCompletionEntryDetails;
|
|
76
80
|
languageService.getCodeFixesAtPosition = proxy.getCodeFixesAtPosition;
|
|
81
|
+
languageService.getDefinitionAndBoundSpan = proxy.getDefinitionAndBoundSpan;
|
|
77
82
|
languageService.getQuickInfoAtPosition = proxy.getQuickInfoAtPosition;
|
|
78
83
|
}
|
|
79
84
|
return created;
|
|
@@ -101,28 +106,31 @@ function getFullLanguageServicePlugins(ts, { disableAutoImportCache } = {}) {
|
|
|
101
106
|
};
|
|
102
107
|
return {
|
|
103
108
|
async collectExtractProps(...args) {
|
|
104
|
-
return
|
|
109
|
+
return collectExtractProps_1.collectExtractProps.apply(requestContext, args);
|
|
105
110
|
},
|
|
106
111
|
async getPropertiesAtLocation(...args) {
|
|
107
|
-
return
|
|
112
|
+
return getPropertiesAtLocation_1.getPropertiesAtLocation.apply(requestContext, args);
|
|
108
113
|
},
|
|
109
114
|
async getImportPathForFile(...args) {
|
|
110
|
-
return
|
|
115
|
+
return getImportPathForFile_1.getImportPathForFile.apply(requestContext, args);
|
|
111
116
|
},
|
|
112
117
|
async getComponentEvents(...args) {
|
|
113
|
-
return
|
|
118
|
+
return getComponentEvents_1.getComponentEvents.apply(requestContext, args);
|
|
114
119
|
},
|
|
115
120
|
async getComponentDirectives(...args) {
|
|
116
|
-
return
|
|
121
|
+
return getComponentDirectives_1.getComponentDirectives.apply(requestContext, args);
|
|
117
122
|
},
|
|
118
123
|
async getComponentNames(...args) {
|
|
119
|
-
return
|
|
124
|
+
return getComponentNames_1.getComponentNames.apply(requestContext, args);
|
|
120
125
|
},
|
|
121
126
|
async getComponentProps(...args) {
|
|
122
|
-
return
|
|
127
|
+
return getComponentProps_1.getComponentProps.apply(requestContext, args);
|
|
123
128
|
},
|
|
124
129
|
async getElementAttrs(...args) {
|
|
125
|
-
return
|
|
130
|
+
return getElementAttrs_1.getElementAttrs.apply(requestContext, args);
|
|
131
|
+
},
|
|
132
|
+
async getElementNames(...args) {
|
|
133
|
+
return getElementNames_1.getElementNames.apply(requestContext, args);
|
|
126
134
|
},
|
|
127
135
|
async getQuickInfoAtPosition(fileName, position) {
|
|
128
136
|
const languageService = context.getLanguageService();
|
|
@@ -131,8 +139,7 @@ function getFullLanguageServicePlugins(ts, { disableAutoImportCache } = {}) {
|
|
|
131
139
|
if (!sourceScript) {
|
|
132
140
|
return;
|
|
133
141
|
}
|
|
134
|
-
const
|
|
135
|
-
const hover = await languageService.getHover(uri, document.positionAt(position));
|
|
142
|
+
const hover = await languageService.getHover(uri, position);
|
|
136
143
|
let text = '';
|
|
137
144
|
if (typeof hover?.contents === 'string') {
|
|
138
145
|
text = hover.contents;
|
|
@@ -160,12 +167,15 @@ function getFullLanguageServicePlugins(ts, { disableAutoImportCache } = {}) {
|
|
|
160
167
|
};
|
|
161
168
|
}
|
|
162
169
|
}
|
|
163
|
-
function getHybridModeLanguageServicePlugins(ts,
|
|
170
|
+
function getHybridModeLanguageServicePlugins(ts, tsPluginClient) {
|
|
164
171
|
const plugins = [
|
|
165
172
|
(0, syntactic_1.create)(ts),
|
|
166
173
|
(0, docCommentTemplate_1.create)(ts),
|
|
167
|
-
...getCommonLanguageServicePlugins(ts, () =>
|
|
174
|
+
...getCommonLanguageServicePlugins(ts, () => tsPluginClient)
|
|
168
175
|
];
|
|
176
|
+
if (tsPluginClient) {
|
|
177
|
+
plugins.push((0, vue_document_highlights_1.create)(tsPluginClient.getDocumentHighlights));
|
|
178
|
+
}
|
|
169
179
|
for (const plugin of plugins) {
|
|
170
180
|
// avoid affecting TS plugin
|
|
171
181
|
delete plugin.capabilities.semanticTokensProvider;
|
|
@@ -178,12 +188,14 @@ function getCommonLanguageServicePlugins(ts, getTsPluginClient) {
|
|
|
178
188
|
(0, css_1.create)(),
|
|
179
189
|
(0, volar_service_pug_beautify_1.create)(),
|
|
180
190
|
(0, volar_service_json_1.create)(),
|
|
181
|
-
(0, vue_template_1.create)('html',
|
|
182
|
-
(0, vue_template_1.create)('pug',
|
|
191
|
+
(0, vue_template_1.create)('html', getTsPluginClient),
|
|
192
|
+
(0, vue_template_1.create)('pug', getTsPluginClient),
|
|
193
|
+
(0, vue_missing_props_hints_1.create)(getTsPluginClient),
|
|
194
|
+
(0, vue_compiler_dom_errors_1.create)(),
|
|
183
195
|
(0, vue_sfc_1.create)(),
|
|
184
196
|
(0, vue_twoslash_queries_1.create)(getTsPluginClient),
|
|
185
|
-
(0, vue_document_links_1.create)(),
|
|
186
197
|
(0, vue_document_drop_1.create)(ts, getTsPluginClient),
|
|
198
|
+
(0, vue_document_links_1.create)(),
|
|
187
199
|
(0, vue_complete_define_assignment_1.create)(),
|
|
188
200
|
(0, vue_autoinsert_dotvalue_1.create)(ts, getTsPluginClient),
|
|
189
201
|
(0, vue_autoinsert_space_1.create)(),
|
|
@@ -17,7 +17,7 @@ async function convertTagName(context, uri, casing, tsPluginClient) {
|
|
|
17
17
|
if (!(root instanceof language_core_1.VueVirtualCode)) {
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
const { template } = root.
|
|
20
|
+
const { template } = root._sfc;
|
|
21
21
|
if (!template) {
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
@@ -52,7 +52,7 @@ async function convertAttrName(context, uri, casing, tsPluginClient) {
|
|
|
52
52
|
if (!(root instanceof language_core_1.VueVirtualCode)) {
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
|
-
const { template } = root.
|
|
55
|
+
const { template } = root._sfc;
|
|
56
56
|
if (!template) {
|
|
57
57
|
return;
|
|
58
58
|
}
|
|
@@ -132,8 +132,8 @@ async function detect(context, uri) {
|
|
|
132
132
|
}
|
|
133
133
|
function getTagNameCase(file) {
|
|
134
134
|
const result = new Set();
|
|
135
|
-
if (file.
|
|
136
|
-
for (const element of vue.forEachElementNode(file.
|
|
135
|
+
if (file._sfc.template?.ast) {
|
|
136
|
+
for (const element of vue.forEachElementNode(file._sfc.template.ast)) {
|
|
137
137
|
if (element.tagType === 1) {
|
|
138
138
|
if (element.tag !== (0, language_core_1.hyphenateTag)(element.tag)) {
|
|
139
139
|
// TagName
|
|
@@ -157,7 +157,7 @@ function getTemplateTagsAndAttrs(sourceFile) {
|
|
|
157
157
|
if (!(sourceFile instanceof vue.VueVirtualCode)) {
|
|
158
158
|
return;
|
|
159
159
|
}
|
|
160
|
-
const ast = sourceFile.
|
|
160
|
+
const ast = sourceFile._sfc.template?.ast;
|
|
161
161
|
const tags = new Map();
|
|
162
162
|
if (ast) {
|
|
163
163
|
for (const node of vue.forEachElementNode(ast)) {
|
|
@@ -197,6 +197,6 @@ function getTemplateTagsAndAttrs(sourceFile) {
|
|
|
197
197
|
});
|
|
198
198
|
map.set(sourceFile, getter);
|
|
199
199
|
}
|
|
200
|
-
return map.get(sourceFile)() ?? new Map();
|
|
200
|
+
return map.get(sourceFile).get() ?? new Map();
|
|
201
201
|
}
|
|
202
202
|
//# sourceMappingURL=nameCasing.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { LanguageServiceContext } from '@volar/language-service';
|
|
2
|
+
import type * as vscode from 'vscode-languageserver-protocol';
|
|
3
|
+
import type { URI } from 'vscode-uri';
|
|
4
|
+
import { AttrNameCasing, TagNameCasing } from './types';
|
|
5
|
+
export declare function convertTagName(context: LanguageServiceContext, uri: URI, casing: TagNameCasing, tsPluginClient: import('@vue/typescript-plugin/lib/requests').Requests | undefined): Promise<vscode.TextEdit[] | undefined>;
|
|
6
|
+
export declare function convertAttrName(context: LanguageServiceContext, uri: URI, casing: AttrNameCasing, tsPluginClient?: import('@vue/typescript-plugin/lib/requests').Requests): Promise<vscode.TextEdit[] | undefined>;
|
|
7
|
+
export declare function getNameCasing(context: LanguageServiceContext, uri: URI): Promise<{
|
|
8
|
+
tag: TagNameCasing;
|
|
9
|
+
attr: AttrNameCasing;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function detect(context: LanguageServiceContext, uri: URI): Promise<{
|
|
12
|
+
tag: TagNameCasing[];
|
|
13
|
+
attr: AttrNameCasing[];
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.convertTagName = convertTagName;
|
|
4
|
+
exports.convertAttrName = convertAttrName;
|
|
5
|
+
exports.getNameCasing = getNameCasing;
|
|
6
|
+
exports.detect = detect;
|
|
7
|
+
const language_core_1 = require("@vue/language-core");
|
|
8
|
+
const alien_signals_1 = require("alien-signals");
|
|
9
|
+
const types_1 = require("./types");
|
|
10
|
+
async function convertTagName(context, uri, casing, tsPluginClient) {
|
|
11
|
+
const sourceFile = context.language.scripts.get(uri);
|
|
12
|
+
if (!sourceFile) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const root = sourceFile?.generated?.root;
|
|
16
|
+
if (!(root instanceof language_core_1.VueVirtualCode)) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const { template } = root.sfc;
|
|
20
|
+
if (!template) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const document = context.documents.get(sourceFile.id, sourceFile.languageId, sourceFile.snapshot);
|
|
24
|
+
const edits = [];
|
|
25
|
+
const components = await tsPluginClient?.getComponentNames(root.fileName) ?? [];
|
|
26
|
+
const tags = getTemplateTagsAndAttrs(root);
|
|
27
|
+
for (const [tagName, { offsets }] of tags) {
|
|
28
|
+
const componentName = components.find(component => component === tagName || (0, language_core_1.hyphenateTag)(component) === tagName);
|
|
29
|
+
if (componentName) {
|
|
30
|
+
for (const offset of offsets) {
|
|
31
|
+
const start = document.positionAt(template.startTagEnd + offset);
|
|
32
|
+
const end = document.positionAt(template.startTagEnd + offset + tagName.length);
|
|
33
|
+
const range = { start, end };
|
|
34
|
+
if (casing === types_1.TagNameCasing.Kebab && tagName !== (0, language_core_1.hyphenateTag)(componentName)) {
|
|
35
|
+
edits.push({ range, newText: (0, language_core_1.hyphenateTag)(componentName) });
|
|
36
|
+
}
|
|
37
|
+
if (casing === types_1.TagNameCasing.Pascal && tagName !== componentName) {
|
|
38
|
+
edits.push({ range, newText: componentName });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return edits;
|
|
44
|
+
}
|
|
45
|
+
async function convertAttrName(context, uri, casing, tsPluginClient) {
|
|
46
|
+
const sourceFile = context.language.scripts.get(uri);
|
|
47
|
+
if (!sourceFile) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const root = sourceFile?.generated?.root;
|
|
51
|
+
if (!(root instanceof language_core_1.VueVirtualCode)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const { template } = root.sfc;
|
|
55
|
+
if (!template) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const document = context.documents.get(uri, sourceFile.languageId, sourceFile.snapshot);
|
|
59
|
+
const edits = [];
|
|
60
|
+
const components = await tsPluginClient?.getComponentNames(root.fileName) ?? [];
|
|
61
|
+
const tags = getTemplateTagsAndAttrs(root);
|
|
62
|
+
for (const [tagName, { attrs }] of tags) {
|
|
63
|
+
const componentName = components.find(component => component === tagName || (0, language_core_1.hyphenateTag)(component) === tagName);
|
|
64
|
+
if (componentName) {
|
|
65
|
+
const props = (await tsPluginClient?.getComponentProps(root.fileName, componentName) ?? []).map(prop => prop.name);
|
|
66
|
+
for (const [attrName, { offsets }] of attrs) {
|
|
67
|
+
const propName = props.find(prop => prop === attrName || (0, language_core_1.hyphenateAttr)(prop) === attrName);
|
|
68
|
+
if (propName) {
|
|
69
|
+
for (const offset of offsets) {
|
|
70
|
+
const start = document.positionAt(template.startTagEnd + offset);
|
|
71
|
+
const end = document.positionAt(template.startTagEnd + offset + attrName.length);
|
|
72
|
+
const range = { start, end };
|
|
73
|
+
if (casing === types_1.AttrNameCasing.Kebab && attrName !== (0, language_core_1.hyphenateAttr)(propName)) {
|
|
74
|
+
edits.push({ range, newText: (0, language_core_1.hyphenateAttr)(propName) });
|
|
75
|
+
}
|
|
76
|
+
if (casing === types_1.AttrNameCasing.Camel && attrName !== propName) {
|
|
77
|
+
edits.push({ range, newText: propName });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return edits;
|
|
85
|
+
}
|
|
86
|
+
async function getNameCasing(context, uri) {
|
|
87
|
+
const detected = await detect(context, uri);
|
|
88
|
+
const [attr, tag] = await Promise.all([
|
|
89
|
+
context.env.getConfiguration?.('vue.complete.casing.props', uri.toString()),
|
|
90
|
+
context.env.getConfiguration?.('vue.complete.casing.tags', uri.toString()),
|
|
91
|
+
]);
|
|
92
|
+
const tagNameCasing = detected.tag.length === 1 && (tag === 'autoPascal' || tag === 'autoKebab') ? detected.tag[0] : (tag === 'autoKebab' || tag === 'kebab') ? types_1.TagNameCasing.Kebab : types_1.TagNameCasing.Pascal;
|
|
93
|
+
const attrNameCasing = detected.attr.length === 1 && (attr === 'autoCamel' || attr === 'autoKebab') ? detected.attr[0] : (attr === 'autoCamel' || attr === 'camel') ? types_1.AttrNameCasing.Camel : types_1.AttrNameCasing.Kebab;
|
|
94
|
+
return {
|
|
95
|
+
tag: tagNameCasing,
|
|
96
|
+
attr: attrNameCasing,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async function detect(context, uri) {
|
|
100
|
+
const rootFile = context.language.scripts.get(uri)?.generated?.root;
|
|
101
|
+
if (!(rootFile instanceof language_core_1.VueVirtualCode)) {
|
|
102
|
+
return {
|
|
103
|
+
tag: [],
|
|
104
|
+
attr: [],
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
tag: await getTagNameCase(rootFile),
|
|
109
|
+
attr: getAttrNameCase(rootFile),
|
|
110
|
+
};
|
|
111
|
+
function getAttrNameCase(file) {
|
|
112
|
+
const tags = getTemplateTagsAndAttrs(file);
|
|
113
|
+
const result = [];
|
|
114
|
+
for (const [_, { attrs }] of tags) {
|
|
115
|
+
for (const [tagName] of attrs) {
|
|
116
|
+
// attrName
|
|
117
|
+
if (tagName !== (0, language_core_1.hyphenateTag)(tagName)) {
|
|
118
|
+
result.push(types_1.AttrNameCasing.Camel);
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const [tagName] of attrs) {
|
|
123
|
+
// attr-name
|
|
124
|
+
if (tagName.includes('-')) {
|
|
125
|
+
result.push(types_1.AttrNameCasing.Kebab);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
function getTagNameCase(file) {
|
|
133
|
+
const result = new Set();
|
|
134
|
+
if (file.sfc.template?.ast) {
|
|
135
|
+
for (const element of (0, language_core_1.forEachElementNode)(file.sfc.template.ast)) {
|
|
136
|
+
if (element.tagType === 1) {
|
|
137
|
+
if (element.tag !== (0, language_core_1.hyphenateTag)(element.tag)) {
|
|
138
|
+
// TagName
|
|
139
|
+
result.add(types_1.TagNameCasing.Pascal);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Tagname -> tagname
|
|
143
|
+
// TagName -> tag-name
|
|
144
|
+
result.add(types_1.TagNameCasing.Kebab);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return [...result];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const map = new WeakMap();
|
|
153
|
+
function getTemplateTagsAndAttrs(sourceFile) {
|
|
154
|
+
if (!map.has(sourceFile)) {
|
|
155
|
+
const getter = (0, alien_signals_1.computed)(() => {
|
|
156
|
+
if (!(sourceFile instanceof language_core_1.VueVirtualCode)) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const ast = sourceFile.sfc.template?.ast;
|
|
160
|
+
const tags = new Map();
|
|
161
|
+
if (ast) {
|
|
162
|
+
for (const node of (0, language_core_1.forEachElementNode)(ast)) {
|
|
163
|
+
if (!tags.has(node.tag)) {
|
|
164
|
+
tags.set(node.tag, { offsets: [], attrs: new Map() });
|
|
165
|
+
}
|
|
166
|
+
const tag = tags.get(node.tag);
|
|
167
|
+
const startTagHtmlOffset = node.loc.start.offset + node.loc.source.indexOf(node.tag);
|
|
168
|
+
const endTagHtmlOffset = node.loc.start.offset + node.loc.source.lastIndexOf(node.tag);
|
|
169
|
+
tag.offsets.push(startTagHtmlOffset);
|
|
170
|
+
if (!node.isSelfClosing) {
|
|
171
|
+
tag.offsets.push(endTagHtmlOffset);
|
|
172
|
+
}
|
|
173
|
+
for (const prop of node.props) {
|
|
174
|
+
let name;
|
|
175
|
+
let offset;
|
|
176
|
+
if (prop.type === 7
|
|
177
|
+
&& prop.arg?.type === 4
|
|
178
|
+
&& prop.arg.isStatic) {
|
|
179
|
+
name = prop.arg.content;
|
|
180
|
+
offset = prop.arg.loc.start.offset;
|
|
181
|
+
}
|
|
182
|
+
else if (prop.type === 6) {
|
|
183
|
+
name = prop.name;
|
|
184
|
+
offset = prop.loc.start.offset;
|
|
185
|
+
}
|
|
186
|
+
if (name !== undefined && offset !== undefined) {
|
|
187
|
+
if (!tag.attrs.has(name)) {
|
|
188
|
+
tag.attrs.set(name, { offsets: [] });
|
|
189
|
+
}
|
|
190
|
+
tag.attrs.get(name).offsets.push(offset);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return tags;
|
|
196
|
+
});
|
|
197
|
+
map.set(sourceFile, getter);
|
|
198
|
+
}
|
|
199
|
+
return map.get(sourceFile)() ?? new Map();
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=nameCasing.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service';
|
|
2
|
-
export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) =>
|
|
2
|
+
export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.create = create;
|
|
4
|
+
const language_core_1 = require("@vue/language-core");
|
|
5
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
6
|
+
function create() {
|
|
7
|
+
return {
|
|
8
|
+
name: 'vue-compiler-dom-errors',
|
|
9
|
+
capabilities: {
|
|
10
|
+
diagnosticProvider: {
|
|
11
|
+
interFileDependencies: false,
|
|
12
|
+
workspaceDiagnostics: false,
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
create(context) {
|
|
16
|
+
return {
|
|
17
|
+
provideDiagnostics(document) {
|
|
18
|
+
if (!isSupportedDocument(document)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const uri = vscode_uri_1.URI.parse(document.uri);
|
|
22
|
+
const decoded = context.decodeEmbeddedDocumentUri(uri);
|
|
23
|
+
const sourceScript = decoded && context.language.scripts.get(decoded[0]);
|
|
24
|
+
const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
|
|
25
|
+
if (!virtualCode) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const root = sourceScript?.generated?.root;
|
|
29
|
+
if (!(root instanceof language_core_1.VueVirtualCode)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const templateErrors = [];
|
|
33
|
+
const { template } = root.sfc;
|
|
34
|
+
if (template) {
|
|
35
|
+
for (const error of template.errors) {
|
|
36
|
+
onCompilerError(error, 1);
|
|
37
|
+
}
|
|
38
|
+
for (const warning of template.warnings) {
|
|
39
|
+
onCompilerError(warning, 2);
|
|
40
|
+
}
|
|
41
|
+
function onCompilerError(error, severity) {
|
|
42
|
+
const templateHtmlRange = {
|
|
43
|
+
start: error.loc?.start.offset ?? 0,
|
|
44
|
+
end: error.loc?.end.offset ?? 0,
|
|
45
|
+
};
|
|
46
|
+
let errorMessage = error.message;
|
|
47
|
+
templateErrors.push({
|
|
48
|
+
range: {
|
|
49
|
+
start: document.positionAt(templateHtmlRange.start),
|
|
50
|
+
end: document.positionAt(templateHtmlRange.end),
|
|
51
|
+
},
|
|
52
|
+
severity,
|
|
53
|
+
code: error.code,
|
|
54
|
+
source: 'vue',
|
|
55
|
+
message: errorMessage,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return templateErrors;
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
function isSupportedDocument(document) {
|
|
65
|
+
return document.languageId === 'jade' || document.languageId === 'html';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=vue-compiler-dom-errors.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { LanguageServiceContext, LanguageServicePlugin } from '../types';
|
|
2
|
-
export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) =>
|
|
2
|
+
export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.create = create;
|
|
4
|
+
const language_core_1 = require("@vue/language-core");
|
|
5
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
6
|
+
function create(getDocumentHighlights) {
|
|
7
|
+
return {
|
|
8
|
+
name: 'vue-document-highlights',
|
|
9
|
+
capabilities: {
|
|
10
|
+
documentHighlightProvider: true,
|
|
11
|
+
},
|
|
12
|
+
create(context) {
|
|
13
|
+
return {
|
|
14
|
+
async provideDocumentHighlights(document, position) {
|
|
15
|
+
const uri = vscode_uri_1.URI.parse(document.uri);
|
|
16
|
+
const decoded = context.decodeEmbeddedDocumentUri(uri);
|
|
17
|
+
const sourceScript = decoded && context.language.scripts.get(decoded[0]);
|
|
18
|
+
const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
|
|
19
|
+
if (!sourceScript?.generated || virtualCode?.id !== 'main') {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const root = sourceScript.generated.root;
|
|
23
|
+
if (!(root instanceof language_core_1.VueVirtualCode)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const result = await getDocumentHighlights(root.fileName, document.offsetAt(position));
|
|
27
|
+
return result
|
|
28
|
+
?.filter(({ fileName }) => fileName === root.fileName)
|
|
29
|
+
.flatMap(({ highlightSpans }) => highlightSpans)
|
|
30
|
+
.map(({ textSpan, kind }) => ({
|
|
31
|
+
range: {
|
|
32
|
+
start: document.positionAt(textSpan.start),
|
|
33
|
+
end: document.positionAt(textSpan.start + textSpan.length),
|
|
34
|
+
},
|
|
35
|
+
kind: kind === 'reference'
|
|
36
|
+
? 2
|
|
37
|
+
: kind === 'writtenReference'
|
|
38
|
+
? 3
|
|
39
|
+
: 1,
|
|
40
|
+
}));
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=vue-document-highlights.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service';
|
|
2
2
|
import { Sfc } from '@vue/language-core';
|
|
3
3
|
import type * as ts from 'typescript';
|
|
4
|
-
export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) =>
|
|
4
|
+
export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
|
|
5
5
|
export declare function getLastImportNode(ts: typeof import('typescript'), sourceFile: ts.SourceFile): ts.Node | undefined;
|
|
6
6
|
export declare function createAddComponentToOptionEdit(ts: typeof import('typescript'), sfc: Sfc, ast: ts.SourceFile, componentName: string): {
|
|
7
7
|
range: import("@vue/language-core").TextRange;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LanguageServiceContext } from '@volar/language-service';
|
|
2
|
+
import { LanguageServicePlugin } from '../types';
|
|
3
|
+
export declare function create(getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
|