@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/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/ideFeatures/nameCasing"), exports);
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/ideFeatures/nameCasing");
56
- function getFullLanguageServicePlugins(ts, { disableAutoImportCache } = {}) {
59
+ const nameCasing_1 = require("./lib/nameCasing");
60
+ function getFullLanguageServicePlugins(ts) {
57
61
  const plugins = [
58
- ...(0, volar_service_typescript_1.create)(ts, { disableAutoImportCache }),
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 await collectExtractProps_1.collectExtractProps.apply(requestContext, args);
109
+ return collectExtractProps_1.collectExtractProps.apply(requestContext, args);
105
110
  },
106
111
  async getPropertiesAtLocation(...args) {
107
- return await getPropertiesAtLocation_1.getPropertiesAtLocation.apply(requestContext, args);
112
+ return getPropertiesAtLocation_1.getPropertiesAtLocation.apply(requestContext, args);
108
113
  },
109
114
  async getImportPathForFile(...args) {
110
- return await getImportPathForFile_1.getImportPathForFile.apply(requestContext, args);
115
+ return getImportPathForFile_1.getImportPathForFile.apply(requestContext, args);
111
116
  },
112
117
  async getComponentEvents(...args) {
113
- return await getComponentEvents_1.getComponentEvents.apply(requestContext, args);
118
+ return getComponentEvents_1.getComponentEvents.apply(requestContext, args);
114
119
  },
115
120
  async getComponentDirectives(...args) {
116
- return await getComponentDirectives_1.getComponentDirectives.apply(requestContext, args);
121
+ return getComponentDirectives_1.getComponentDirectives.apply(requestContext, args);
117
122
  },
118
123
  async getComponentNames(...args) {
119
- return await getComponentNames_1.getComponentNames.apply(requestContext, args);
124
+ return getComponentNames_1.getComponentNames.apply(requestContext, args);
120
125
  },
121
126
  async getComponentProps(...args) {
122
- return await getComponentProps_1.getComponentProps.apply(requestContext, args);
127
+ return getComponentProps_1.getComponentProps.apply(requestContext, args);
123
128
  },
124
129
  async getElementAttrs(...args) {
125
- return await getElementAttrs_1.getElementAttrs.apply(requestContext, args);
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 document = context.documents.get(uri, sourceScript.languageId, sourceScript.snapshot);
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, getTsPluginClient) {
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, () => getTsPluginClient)
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', ts, getTsPluginClient),
182
- (0, vue_template_1.create)('pug', ts, getTsPluginClient),
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.sfc;
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.sfc;
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.sfc.template?.ast) {
136
- for (const element of vue.forEachElementNode(file.sfc.template.ast)) {
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.sfc.template?.ast;
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) => typeof import('@vue/typescript-plugin/lib/client') | undefined): LanguageServicePlugin;
2
+ export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
@@ -0,0 +1,2 @@
1
+ import { LanguageServicePlugin } from '../types';
2
+ export declare function create(): 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) => typeof import('@vue/typescript-plugin/lib/client') | undefined): LanguageServicePlugin;
2
+ export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
@@ -0,0 +1,3 @@
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ import type * as ts from 'typescript';
3
+ export declare function create(getDocumentHighlights: (fileName: string, position: number) => Promise<ts.DocumentHighlights[] | null>): 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) => typeof import('@vue/typescript-plugin/lib/client') | undefined): LanguageServicePlugin;
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;