@vue/language-service 3.0.3 → 3.0.4

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.
Files changed (37) hide show
  1. package/index.d.ts +1 -12
  2. package/index.js +14 -15
  3. package/lib/plugins/css.js +9 -17
  4. package/lib/plugins/typescript-semantic-tokens.d.ts +2 -2
  5. package/lib/plugins/typescript-semantic-tokens.js +6 -14
  6. package/lib/plugins/utils.d.ts +8 -2
  7. package/lib/plugins/utils.js +39 -6
  8. package/lib/plugins/vue-autoinsert-dotvalue.d copy.d.ts +2 -0
  9. package/lib/plugins/vue-autoinsert-dotvalue.d copy.js +3 -0
  10. package/lib/plugins/vue-autoinsert-dotvalue.d.ts +2 -2
  11. package/lib/plugins/vue-autoinsert-dotvalue.js +15 -32
  12. package/lib/plugins/vue-compiler-dom-errors.js +17 -35
  13. package/lib/plugins/vue-component-semantic-tokens.d.ts +2 -2
  14. package/lib/plugins/vue-component-semantic-tokens.js +35 -49
  15. package/lib/plugins/vue-destructured-props-hints.d.ts +7 -0
  16. package/lib/plugins/vue-destructured-props-hints.js +220 -0
  17. package/lib/plugins/vue-document-drop.d.ts +2 -2
  18. package/lib/plugins/vue-document-drop.js +12 -26
  19. package/lib/plugins/vue-document-highlights.d.ts +1 -2
  20. package/lib/plugins/vue-document-highlights.js +6 -13
  21. package/lib/plugins/vue-extract-file.d.ts +2 -2
  22. package/lib/plugins/vue-extract-file.js +10 -25
  23. package/lib/plugins/vue-global-types-error.js +16 -16
  24. package/lib/plugins/vue-inlayhints.js +14 -15
  25. package/lib/plugins/vue-missing-props-hints.d.ts +2 -2
  26. package/lib/plugins/vue-missing-props-hints.js +7 -23
  27. package/lib/plugins/vue-scoped-class-links.d.ts +2 -0
  28. package/lib/plugins/vue-scoped-class-links.js +62 -0
  29. package/lib/plugins/vue-sfc.js +140 -143
  30. package/lib/plugins/vue-suggest-define-assignment.js +3 -13
  31. package/lib/plugins/vue-template-ref-links.d.ts +2 -0
  32. package/lib/plugins/vue-template-ref-links.js +57 -0
  33. package/lib/plugins/vue-template.d.ts +2 -2
  34. package/lib/plugins/vue-template.js +320 -353
  35. package/lib/plugins/vue-twoslash-queries.d.ts +2 -2
  36. package/lib/plugins/vue-twoslash-queries.js +6 -15
  37. package/package.json +4 -4
package/index.d.ts CHANGED
@@ -1,14 +1,3 @@
1
1
  export * from '@volar/language-service';
2
2
  export * from '@volar/language-service/lib/utils/featureWorkers';
3
- import type { VueCompilerOptions } from '@vue/language-core';
4
- import type * as ts from 'typescript';
5
- declare module '@volar/language-service' {
6
- interface ProjectContext {
7
- vue?: {
8
- compilerOptions: VueCompilerOptions;
9
- };
10
- }
11
- }
12
- export declare function createVueLanguageServicePlugins(ts: typeof import('typescript'), tsPluginClient: (import('@vue/typescript-plugin/lib/requests').Requests & {
13
- getDocumentHighlights: (fileName: string, position: number) => Promise<ts.DocumentHighlights[] | null>;
14
- }) | undefined): import("@volar/language-service").LanguageServicePlugin<any>[];
3
+ export declare function createVueLanguageServicePlugins(ts: typeof import('typescript'), tsPluginClient: import('@vue/typescript-plugin/lib/requests').Requests | undefined): import("@volar/language-service").LanguageServicePlugin<any>[];
package/index.js CHANGED
@@ -33,40 +33,42 @@ const vue_component_semantic_tokens_1 = require("./lib/plugins/vue-component-sem
33
33
  const vue_directive_comments_1 = require("./lib/plugins/vue-directive-comments");
34
34
  const vue_document_drop_1 = require("./lib/plugins/vue-document-drop");
35
35
  const vue_document_highlights_1 = require("./lib/plugins/vue-document-highlights");
36
- const vue_document_links_1 = require("./lib/plugins/vue-document-links");
37
36
  const vue_extract_file_1 = require("./lib/plugins/vue-extract-file");
38
37
  const vue_global_types_error_1 = require("./lib/plugins/vue-global-types-error");
39
38
  const vue_inlayhints_1 = require("./lib/plugins/vue-inlayhints");
40
39
  const vue_missing_props_hints_1 = require("./lib/plugins/vue-missing-props-hints");
40
+ const vue_scoped_class_links_1 = require("./lib/plugins/vue-scoped-class-links");
41
41
  const vue_sfc_1 = require("./lib/plugins/vue-sfc");
42
42
  const vue_suggest_define_assignment_1 = require("./lib/plugins/vue-suggest-define-assignment");
43
43
  const vue_template_1 = require("./lib/plugins/vue-template");
44
+ const vue_template_ref_links_1 = require("./lib/plugins/vue-template-ref-links");
44
45
  const vue_twoslash_queries_1 = require("./lib/plugins/vue-twoslash-queries");
45
46
  function createVueLanguageServicePlugins(ts, tsPluginClient) {
46
- const getTsPluginClient = () => tsPluginClient;
47
47
  const plugins = [
48
48
  (0, css_1.create)(),
49
49
  (0, volar_service_json_1.create)(),
50
50
  (0, volar_service_pug_beautify_1.create)(),
51
51
  (0, docCommentTemplate_1.create)(ts),
52
- (0, typescript_semantic_tokens_1.create)(getTsPluginClient),
52
+ (0, typescript_semantic_tokens_1.create)(tsPluginClient),
53
53
  (0, syntactic_1.create)(ts),
54
54
  (0, vue_autoinsert_space_1.create)(),
55
- (0, vue_autoinsert_dotvalue_1.create)(ts, getTsPluginClient),
55
+ (0, vue_autoinsert_dotvalue_1.create)(ts, tsPluginClient),
56
56
  (0, vue_compiler_dom_errors_1.create)(),
57
- (0, vue_component_semantic_tokens_1.create)(getTsPluginClient),
58
- (0, vue_document_drop_1.create)(ts, getTsPluginClient),
59
- (0, vue_document_links_1.create)(),
57
+ (0, vue_component_semantic_tokens_1.create)(tsPluginClient),
58
+ (0, vue_document_drop_1.create)(ts, tsPluginClient),
59
+ (0, vue_document_highlights_1.create)(tsPluginClient),
60
60
  (0, vue_directive_comments_1.create)(),
61
- (0, vue_extract_file_1.create)(ts, getTsPluginClient),
61
+ (0, vue_extract_file_1.create)(ts, tsPluginClient),
62
62
  (0, vue_global_types_error_1.create)(),
63
63
  (0, vue_inlayhints_1.create)(ts),
64
- (0, vue_missing_props_hints_1.create)(getTsPluginClient),
64
+ (0, vue_missing_props_hints_1.create)(tsPluginClient),
65
+ (0, vue_scoped_class_links_1.create)(),
65
66
  (0, vue_sfc_1.create)(),
66
67
  (0, vue_suggest_define_assignment_1.create)(),
67
- (0, vue_template_1.create)('html', getTsPluginClient),
68
- (0, vue_template_1.create)('pug', getTsPluginClient),
69
- (0, vue_twoslash_queries_1.create)(getTsPluginClient),
68
+ (0, vue_template_1.create)('html', tsPluginClient),
69
+ (0, vue_template_1.create)('pug', tsPluginClient),
70
+ (0, vue_template_ref_links_1.create)(),
71
+ (0, vue_twoslash_queries_1.create)(tsPluginClient),
70
72
  (0, volar_service_emmet_1.create)({
71
73
  mappedLanguages: {
72
74
  'vue-root-tags': 'html',
@@ -74,9 +76,6 @@ function createVueLanguageServicePlugins(ts, tsPluginClient) {
74
76
  },
75
77
  }),
76
78
  ];
77
- if (tsPluginClient) {
78
- plugins.push((0, vue_document_highlights_1.create)(tsPluginClient.getDocumentHighlights));
79
- }
80
79
  return plugins;
81
80
  }
82
81
  //# sourceMappingURL=index.js.map
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.create = create;
4
4
  const language_core_1 = require("@vue/language-core");
5
5
  const volar_service_css_1 = require("volar-service-css");
6
- const vscode_uri_1 = require("vscode-uri");
6
+ const utils_1 = require("./utils");
7
7
  function create() {
8
8
  const base = (0, volar_service_css_1.create)({ scssDocumentSelector: ['scss', 'postcss'] });
9
9
  return {
@@ -16,9 +16,9 @@ function create() {
16
16
  async provideDiagnostics(document, token) {
17
17
  let diagnostics = await baseInstance.provideDiagnostics?.(document, token) ?? [];
18
18
  if (document.languageId === 'postcss') {
19
- diagnostics = diagnostics.filter(diag => diag.code !== 'css-semicolonexpected');
20
- diagnostics = diagnostics.filter(diag => diag.code !== 'css-ruleorselectorexpected');
21
- diagnostics = diagnostics.filter(diag => diag.code !== 'unknownAtRules');
19
+ diagnostics = diagnostics.filter(diag => diag.code !== 'css-semicolonexpected'
20
+ && diag.code !== 'css-ruleorselectorexpected'
21
+ && diag.code !== 'unknownAtRules');
22
22
  }
23
23
  return diagnostics;
24
24
  },
@@ -44,18 +44,12 @@ function create() {
44
44
  },
45
45
  };
46
46
  function isWithinNavigationVirtualCode(document, position) {
47
- const uri = vscode_uri_1.URI.parse(document.uri);
48
- const decoded = context.decodeEmbeddedDocumentUri(uri);
49
- const sourceScript = decoded && context.language.scripts.get(decoded[0]);
50
- const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
51
- if (!sourceScript?.generated || !virtualCode?.id.startsWith('style_')) {
47
+ const info = (0, utils_1.getEmbeddedInfo)(context, document, id => id.startsWith('style_'));
48
+ if (!info) {
52
49
  return false;
53
50
  }
54
- const root = sourceScript.generated.root;
55
- if (!(root instanceof language_core_1.VueVirtualCode)) {
56
- return false;
57
- }
58
- const block = root.sfc.styles.find(style => style.name === decoded[1]);
51
+ const { sourceScript, virtualCode, root } = info;
52
+ const block = root.sfc.styles.find(style => style.name === virtualCode.id);
59
53
  if (!block) {
60
54
  return false;
61
55
  }
@@ -71,9 +65,7 @@ function create() {
71
65
  }
72
66
  const offset = document.offsetAt(position) + block.startTagEnd;
73
67
  for (const { sourceOffsets, lengths, data } of script.mappings) {
74
- if (!sourceOffsets.length
75
- || !data.navigation
76
- || typeof data.navigation === 'object' && !data.navigation.shouldRename) {
68
+ if (!sourceOffsets.length || !(0, language_core_1.isRenameEnabled)(data)) {
77
69
  continue;
78
70
  }
79
71
  const start = sourceOffsets[0];
@@ -1,2 +1,2 @@
1
- import type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service';
2
- export declare function create(getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ export declare function create(tsPluginClient: import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
@@ -1,12 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.create = create;
4
- const language_core_1 = require("@vue/language-core");
5
4
  const semanticTokens_1 = require("volar-service-typescript/lib/semanticFeatures/semanticTokens");
6
- const vscode_uri_1 = require("vscode-uri");
7
- function create(getTsPluginClient) {
5
+ const utils_1 = require("./utils");
6
+ function create(tsPluginClient) {
8
7
  return {
9
- name: 'typescript-highlights',
8
+ name: 'typescript-semantic-tokens',
10
9
  capabilities: {
11
10
  semanticTokensProvider: {
12
11
  legend: {
@@ -36,20 +35,13 @@ function create(getTsPluginClient) {
36
35
  },
37
36
  },
38
37
  create(context) {
39
- const tsPluginClient = getTsPluginClient?.(context);
40
38
  return {
41
39
  async provideDocumentSemanticTokens(document, range, legend) {
42
- const uri = vscode_uri_1.URI.parse(document.uri);
43
- const decoded = context.decodeEmbeddedDocumentUri(uri);
44
- const sourceScript = decoded && context.language.scripts.get(decoded[0]);
45
- const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
46
- if (!sourceScript?.generated || virtualCode?.id !== 'main') {
47
- return;
48
- }
49
- const root = sourceScript.generated.root;
50
- if (!(root instanceof language_core_1.VueVirtualCode)) {
40
+ const info = (0, utils_1.getEmbeddedInfo)(context, document, 'main');
41
+ if (!info) {
51
42
  return;
52
43
  }
44
+ const { root } = info;
53
45
  const start = document.offsetAt(range.start);
54
46
  const end = document.offsetAt(range.end);
55
47
  const span = {
@@ -1,3 +1,9 @@
1
- import type { TextDocument } from '@volar/language-service';
1
+ import { type LanguageServiceContext, type SourceScript, type TextDocument } from '@volar/language-service';
2
+ import { VueVirtualCode } from '@vue/language-core';
3
+ import { URI } from 'vscode-uri';
2
4
  export declare function sleep(ms: number): Promise<unknown>;
3
- export declare function isTsDocument(document: TextDocument): boolean;
5
+ export declare function getEmbeddedInfo(context: LanguageServiceContext, document: TextDocument, embeddedCodeId?: string | ((id: string) => boolean), languageId?: string): {
6
+ sourceScript: Required<SourceScript<URI>>;
7
+ virtualCode: import("@volar/language-service").VirtualCode;
8
+ root: VueVirtualCode;
9
+ } | undefined;
@@ -1,14 +1,47 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sleep = sleep;
4
- exports.isTsDocument = isTsDocument;
4
+ exports.getEmbeddedInfo = getEmbeddedInfo;
5
+ const language_core_1 = require("@vue/language-core");
6
+ const vscode_uri_1 = require("vscode-uri");
5
7
  function sleep(ms) {
6
8
  return new Promise(resolve => setTimeout(resolve, ms));
7
9
  }
8
- function isTsDocument(document) {
9
- return document.languageId === 'javascript'
10
- || document.languageId === 'typescript'
11
- || document.languageId === 'javascriptreact'
12
- || document.languageId === 'typescriptreact';
10
+ function getEmbeddedInfo(context, document, embeddedCodeId, languageId) {
11
+ const uri = vscode_uri_1.URI.parse(document.uri);
12
+ const decoded = context.decodeEmbeddedDocumentUri(uri);
13
+ if (!decoded) {
14
+ return;
15
+ }
16
+ if (embeddedCodeId) {
17
+ if (typeof embeddedCodeId === 'string') {
18
+ if (decoded[1] !== embeddedCodeId) {
19
+ return;
20
+ }
21
+ }
22
+ else if (!embeddedCodeId(decoded[1])) {
23
+ return;
24
+ }
25
+ }
26
+ if (languageId && document.languageId !== languageId) {
27
+ return;
28
+ }
29
+ const sourceScript = context.language.scripts.get(decoded[0]);
30
+ if (!sourceScript?.generated) {
31
+ return;
32
+ }
33
+ const virtualCode = sourceScript.generated.embeddedCodes.get(decoded[1]);
34
+ if (!virtualCode) {
35
+ return;
36
+ }
37
+ const root = sourceScript.generated.root;
38
+ if (!(root instanceof language_core_1.VueVirtualCode)) {
39
+ return;
40
+ }
41
+ return {
42
+ sourceScript: sourceScript,
43
+ virtualCode,
44
+ root,
45
+ };
13
46
  }
14
47
  //# sourceMappingURL=utils.js.map
@@ -0,0 +1,2 @@
1
+ import type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service';
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
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=vue-autoinsert-dotvalue.d%20copy.js.map
@@ -1,2 +1,2 @@
1
- import type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service';
2
- export declare function create(ts: typeof import('typescript'), getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ export declare function create(ts: typeof import('typescript'), tsPluginClient: import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
@@ -2,9 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.create = create;
4
4
  const language_core_1 = require("@vue/language-core");
5
- const vscode_uri_1 = require("vscode-uri");
6
5
  const utils_1 = require("./utils");
7
- function create(ts, getTsPluginClient) {
6
+ function create(ts, tsPluginClient) {
8
7
  return {
9
8
  name: 'vue-autoinsert-dotvalue',
10
9
  capabilities: {
@@ -14,15 +13,15 @@ function create(ts, getTsPluginClient) {
14
13
  },
15
14
  },
16
15
  create(context) {
17
- const tsPluginClient = getTsPluginClient?.(context);
18
16
  let currentReq = 0;
19
17
  return {
20
18
  async provideAutoInsertSnippet(document, selection, change) {
21
- // selection must at end of change
22
- if (document.offsetAt(selection) !== change.rangeOffset + change.text.length) {
19
+ const info = (0, utils_1.getEmbeddedInfo)(context, document, id => id.startsWith('script_'));
20
+ if (!info) {
23
21
  return;
24
22
  }
25
- if (!(0, utils_1.isTsDocument)(document)) {
23
+ // selection must at end of change
24
+ if (document.offsetAt(selection) !== change.rangeOffset + change.text.length) {
26
25
  return;
27
26
  }
28
27
  if (!isCharacterTyping(document, change)) {
@@ -38,46 +37,30 @@ function create(ts, getTsPluginClient) {
38
37
  if (!enabled) {
39
38
  return;
40
39
  }
41
- const uri = vscode_uri_1.URI.parse(document.uri);
42
- const decoded = context.decodeEmbeddedDocumentUri(uri);
43
- const sourceScript = decoded && context.language.scripts.get(decoded[0]);
44
- const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
45
- if (!sourceScript?.generated || !virtualCode) {
46
- return;
47
- }
48
- const root = sourceScript.generated.root;
49
- if (!(root instanceof language_core_1.VueVirtualCode)) {
50
- return;
51
- }
40
+ const { sourceScript, virtualCode, root } = info;
52
41
  const { sfc } = root;
53
42
  const blocks = [sfc.script, sfc.scriptSetup].filter(block => !!block);
54
43
  if (!blocks.length) {
55
44
  return;
56
45
  }
57
- let sourceCodeOffset = document.offsetAt(selection);
58
- let mapped = false;
59
- for (const [, map] of context.language.maps.forEach(virtualCode)) {
60
- for (const [sourceOffset] of map.toSourceLocation(sourceCodeOffset)) {
61
- sourceCodeOffset = sourceOffset;
62
- mapped = true;
63
- break;
64
- }
65
- if (mapped) {
66
- break;
67
- }
46
+ let sourceOffset;
47
+ const map = context.language.maps.get(virtualCode, sourceScript);
48
+ for (const [offset] of map.toSourceLocation(document.offsetAt(selection))) {
49
+ sourceOffset = offset;
50
+ break;
68
51
  }
69
- if (!mapped) {
52
+ if (sourceOffset === undefined) {
70
53
  return;
71
54
  }
72
55
  for (const { ast, startTagEnd, endTagStart } of blocks) {
73
- if (sourceCodeOffset < startTagEnd || sourceCodeOffset > endTagStart) {
56
+ if (sourceOffset < startTagEnd || sourceOffset > endTagStart) {
74
57
  continue;
75
58
  }
76
- if (isBlacklistNode(ts, ast, sourceCodeOffset - startTagEnd, false)) {
59
+ if (isBlacklistNode(ts, ast, sourceOffset - startTagEnd, false)) {
77
60
  return;
78
61
  }
79
62
  }
80
- const props = await tsPluginClient?.getPropertiesAtLocation(root.fileName, sourceCodeOffset) ?? [];
63
+ const props = await tsPluginClient?.getPropertiesAtLocation(root.fileName, sourceOffset) ?? [];
81
64
  if (props.some(prop => prop === 'value')) {
82
65
  return '${1:.value}';
83
66
  }
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.create = create;
4
- const language_core_1 = require("@vue/language-core");
5
- const vscode_uri_1 = require("vscode-uri");
4
+ const utils_1 = require("./utils");
6
5
  function create() {
7
6
  return {
8
7
  name: 'vue-compiler-dom-errors',
@@ -15,54 +14,37 @@ function create() {
15
14
  create(context) {
16
15
  return {
17
16
  provideDiagnostics(document) {
18
- if (!isSupportedDocument(document)) {
17
+ const info = (0, utils_1.getEmbeddedInfo)(context, document, 'template');
18
+ if (!info) {
19
19
  return;
20
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)) {
21
+ const { root } = info;
22
+ const { template } = root.sfc;
23
+ if (!template) {
30
24
  return;
31
25
  }
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({
26
+ const diagnostics = [];
27
+ for (const [errors, severity] of [
28
+ [template.errors, 1],
29
+ [template.warnings, 2],
30
+ ]) {
31
+ for (const error of errors) {
32
+ diagnostics.push({
48
33
  range: {
49
- start: document.positionAt(templateHtmlRange.start),
50
- end: document.positionAt(templateHtmlRange.end),
34
+ start: document.positionAt(error.loc?.start.offset ?? 0),
35
+ end: document.positionAt(error.loc?.end.offset ?? 0),
51
36
  },
52
37
  severity,
53
38
  code: error.code,
54
39
  source: 'vue',
55
- message: errorMessage,
40
+ message: error.message,
56
41
  });
57
42
  }
58
43
  }
59
- return templateErrors;
44
+ return diagnostics;
60
45
  },
61
46
  };
62
47
  },
63
48
  };
64
- function isSupportedDocument(document) {
65
- return document.languageId === 'jade' || document.languageId === 'html';
66
- }
67
49
  }
68
50
  //# sourceMappingURL=vue-compiler-dom-errors.js.map
@@ -1,2 +1,2 @@
1
- import type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service';
2
- export declare function create(getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ export declare function create(tsPluginClient: import('@vue/typescript-plugin/lib/requests').Requests | undefined): LanguageServicePlugin;
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.create = create;
4
4
  const language_core_1 = require("@vue/language-core");
5
- const vscode_uri_1 = require("vscode-uri");
6
- function create(getTsPluginClient) {
5
+ const utils_1 = require("./utils");
6
+ function create(tsPluginClient) {
7
7
  return {
8
- name: 'vue-component-highlights',
8
+ name: 'vue-component-semantic-tokens',
9
9
  capabilities: {
10
10
  semanticTokensProvider: {
11
11
  legend: {
@@ -15,55 +15,29 @@ function create(getTsPluginClient) {
15
15
  },
16
16
  },
17
17
  create(context) {
18
- const tsPluginClient = getTsPluginClient?.(context);
19
18
  return {
20
19
  async provideDocumentSemanticTokens(document, range, legend) {
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 (!sourceScript?.generated || virtualCode?.id !== 'template') {
26
- return;
27
- }
28
- const root = sourceScript.generated.root;
29
- if (!(root instanceof language_core_1.VueVirtualCode)) {
20
+ const info = (0, utils_1.getEmbeddedInfo)(context, document, 'template');
21
+ if (!info) {
30
22
  return;
31
23
  }
24
+ const { root } = info;
32
25
  const { template } = root.sfc;
33
- if (!template) {
26
+ if (!template?.ast) {
34
27
  return;
35
28
  }
36
- const result = [];
37
- const tokenTypes = legend.tokenTypes.indexOf('component');
38
- const componentSpans = await getComponentSpans(root.fileName, template, {
39
- start: document.offsetAt(range.start),
40
- length: document.offsetAt(range.end) - document.offsetAt(range.start),
41
- });
42
- for (const span of componentSpans) {
43
- const position = document.positionAt(span.start);
44
- result.push([
45
- position.line,
46
- position.character,
47
- span.length,
48
- tokenTypes,
49
- 0,
50
- ]);
51
- }
52
- return result;
53
- },
54
- };
55
- async function getComponentSpans(fileName, template, spanTemplateRange) {
56
- const result = [];
57
- const validComponentNames = await tsPluginClient?.getComponentNames(fileName) ?? [];
58
- const elements = new Set(await tsPluginClient?.getElementNames(fileName) ?? []);
59
- const components = new Set([
60
- ...validComponentNames,
61
- ...validComponentNames.map(language_core_1.hyphenateTag),
62
- ]);
63
- if (template.ast) {
29
+ const componentSpans = [];
30
+ const start = document.offsetAt(range.start);
31
+ const end = document.offsetAt(range.end);
32
+ const validComponentNames = await tsPluginClient?.getComponentNames(root.fileName) ?? [];
33
+ const elements = new Set(await tsPluginClient?.getElementNames(root.fileName) ?? []);
34
+ const components = new Set([
35
+ ...validComponentNames,
36
+ ...validComponentNames.map(language_core_1.hyphenateTag),
37
+ ]);
64
38
  for (const node of (0, language_core_1.forEachElementNode)(template.ast)) {
65
- if (node.loc.end.offset <= spanTemplateRange.start
66
- || node.loc.start.offset >= (spanTemplateRange.start + spanTemplateRange.length)) {
39
+ if (node.loc.end.offset <= start
40
+ || node.loc.start.offset >= end) {
67
41
  continue;
68
42
  }
69
43
  if (components.has(node.tag) && !elements.has(node.tag)) {
@@ -71,21 +45,33 @@ function create(getTsPluginClient) {
71
45
  if (template.lang === 'html') {
72
46
  start += '<'.length;
73
47
  }
74
- result.push({
48
+ componentSpans.push({
75
49
  start,
76
50
  length: node.tag.length,
77
51
  });
78
52
  if (template.lang === 'html' && !node.isSelfClosing) {
79
- result.push({
53
+ componentSpans.push({
80
54
  start: node.loc.start.offset + node.loc.source.lastIndexOf(node.tag),
81
55
  length: node.tag.length,
82
56
  });
83
57
  }
84
58
  }
85
59
  }
86
- }
87
- return result;
88
- }
60
+ const result = [];
61
+ const tokenType = legend.tokenTypes.indexOf('component');
62
+ for (const span of componentSpans) {
63
+ const position = document.positionAt(span.start);
64
+ result.push([
65
+ position.line,
66
+ position.character,
67
+ span.length,
68
+ tokenType,
69
+ 0,
70
+ ]);
71
+ }
72
+ return result;
73
+ },
74
+ };
89
75
  },
90
76
  };
91
77
  }
@@ -0,0 +1,7 @@
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ import type * as ts from 'typescript';
3
+ export declare function create(ts: typeof import('typescript')): LanguageServicePlugin;
4
+ /**
5
+ * Refactored from https://github.com/vuejs/core/blob/main/packages/compiler-sfc/src/script/definePropsDestructure.ts
6
+ */
7
+ export declare function findDestructuredProps(ts: typeof import('typescript'), ast: ts.SourceFile, props: MapIterator<string>): [ts.Identifier, boolean][];