@vue/language-service 3.0.7-alpha.0 → 3.0.7

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 (38) hide show
  1. package/index.d.ts +2 -1
  2. package/index.js +16 -16
  3. package/lib/nameCasing.d.ts +2 -2
  4. package/lib/plugins/css.js +4 -5
  5. package/lib/plugins/data.d.ts +4 -0
  6. package/lib/plugins/data.js +148 -0
  7. package/lib/plugins/typescript-semantic-tokens.js +3 -4
  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 +1 -1
  11. package/lib/plugins/vue-autoinsert-dotvalue.js +6 -8
  12. package/lib/plugins/vue-compiler-dom-errors.js +3 -4
  13. package/lib/plugins/vue-complete-define-assignment.d.ts +2 -0
  14. package/lib/plugins/vue-complete-define-assignment.js +84 -0
  15. package/lib/plugins/vue-component-semantic-tokens.js +5 -6
  16. package/lib/plugins/vue-destructured-props-hints.d.ts +7 -0
  17. package/lib/plugins/vue-destructured-props-hints.js +220 -0
  18. package/lib/plugins/vue-diagnostic-global-types.d.ts +1 -0
  19. package/lib/plugins/vue-diagnostic-global-types.js +3 -0
  20. package/lib/plugins/vue-document-drop.js +14 -12
  21. package/lib/plugins/vue-document-highlights.js +5 -6
  22. package/lib/plugins/vue-document-links.d.ts +2 -0
  23. package/lib/plugins/vue-document-links.js +109 -0
  24. package/lib/plugins/vue-extract-file.js +11 -13
  25. package/lib/plugins/vue-global-types-error.js +5 -6
  26. package/lib/plugins/vue-inlayhints.js +4 -12
  27. package/lib/plugins/vue-missing-props-hints.js +11 -12
  28. package/lib/plugins/vue-scoped-class-links.js +6 -7
  29. package/lib/plugins/vue-sfc.js +10 -13
  30. package/lib/plugins/vue-suggest-define-assignment.js +4 -5
  31. package/lib/plugins/vue-template-ref-links.js +5 -6
  32. package/lib/plugins/vue-template.js +14 -9
  33. package/lib/plugins/vue-twoslash-queries.js +6 -7
  34. package/lib/types.d.ts +13 -0
  35. package/lib/types.js +34 -0
  36. package/lib/utils.d.ts +5 -5
  37. package/lib/utils.js +7 -31
  38. package/package.json +4 -4
package/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from '@volar/language-service';
2
2
  export * from '@volar/language-service/lib/utils/featureWorkers';
3
- export declare function createVueLanguageServicePlugins(ts: typeof import('typescript'), tsPluginClient?: import('@vue/typescript-plugin/lib/requests').Requests): import("@volar/language-service").LanguageServicePlugin<any>[];
3
+ import type { Requests } from '@vue/typescript-plugin/lib/requests';
4
+ export declare function createVueLanguageServicePlugins(ts: typeof import('typescript'), client?: Requests): import("@volar/language-service").LanguageServicePlugin<any>[];
package/index.js CHANGED
@@ -43,12 +43,12 @@ const vue_suggest_define_assignment_1 = require("./lib/plugins/vue-suggest-defin
43
43
  const vue_template_1 = require("./lib/plugins/vue-template");
44
44
  const vue_template_ref_links_1 = require("./lib/plugins/vue-template-ref-links");
45
45
  const vue_twoslash_queries_1 = require("./lib/plugins/vue-twoslash-queries");
46
- function createVueLanguageServicePlugins(ts, tsPluginClient) {
47
- tsPluginClient ??= new Proxy({}, {
48
- get() {
49
- return () => undefined;
50
- },
51
- });
46
+ const noop = () => { };
47
+ function createVueLanguageServicePlugins(ts, client = new Proxy({}, {
48
+ get() {
49
+ return noop;
50
+ },
51
+ })) {
52
52
  return [
53
53
  (0, css_1.create)(),
54
54
  (0, volar_service_json_1.create)(),
@@ -72,16 +72,16 @@ function createVueLanguageServicePlugins(ts, tsPluginClient) {
72
72
  (0, syntactic_1.create)(ts),
73
73
  (0, vue_inlayhints_1.create)(ts),
74
74
  // type aware plugins
75
- (0, typescript_semantic_tokens_1.create)(tsPluginClient),
76
- (0, vue_autoinsert_dotvalue_1.create)(ts, tsPluginClient),
77
- (0, vue_component_semantic_tokens_1.create)(tsPluginClient),
78
- (0, vue_document_drop_1.create)(ts, tsPluginClient),
79
- (0, vue_document_highlights_1.create)(tsPluginClient),
80
- (0, vue_extract_file_1.create)(ts, tsPluginClient),
81
- (0, vue_missing_props_hints_1.create)(tsPluginClient),
82
- (0, vue_template_1.create)('html', tsPluginClient),
83
- (0, vue_template_1.create)('jade', tsPluginClient),
84
- (0, vue_twoslash_queries_1.create)(tsPluginClient),
75
+ (0, typescript_semantic_tokens_1.create)(client),
76
+ (0, vue_autoinsert_dotvalue_1.create)(ts, client),
77
+ (0, vue_component_semantic_tokens_1.create)(client),
78
+ (0, vue_document_drop_1.create)(ts, client),
79
+ (0, vue_document_highlights_1.create)(client),
80
+ (0, vue_extract_file_1.create)(ts, client),
81
+ (0, vue_missing_props_hints_1.create)(client),
82
+ (0, vue_template_1.create)('html', client),
83
+ (0, vue_template_1.create)('jade', client),
84
+ (0, vue_twoslash_queries_1.create)(client),
85
85
  ];
86
86
  }
87
87
  //# sourceMappingURL=index.js.map
@@ -9,6 +9,6 @@ export declare enum AttrNameCasing {
9
9
  Camel = 1
10
10
  }
11
11
  export declare function checkCasing(context: LanguageServiceContext, uri: URI): Promise<{
12
- tag: TagNameCasing;
13
- attr: AttrNameCasing;
12
+ tag: TagNameCasing | undefined;
13
+ attr: AttrNameCasing | undefined;
14
14
  }>;
@@ -44,17 +44,16 @@ function create() {
44
44
  },
45
45
  };
46
46
  function isWithinNavigationVirtualCode(document, position) {
47
- const info = (0, utils_1.getEmbeddedInfo)(context, document, id => id.startsWith('style_'));
48
- if (!info) {
47
+ const info = (0, utils_1.resolveEmbeddedCode)(context, document.uri);
48
+ if (!info?.code.id.startsWith('style_')) {
49
49
  return false;
50
50
  }
51
- const { sourceScript, virtualCode, root } = info;
52
- const block = root.sfc.styles.find(style => style.name === virtualCode.id);
51
+ const block = info.root.sfc.styles.find(style => style.name === info.code.id);
53
52
  if (!block) {
54
53
  return false;
55
54
  }
56
55
  let script;
57
- for (const [key, value] of sourceScript.generated.embeddedCodes) {
56
+ for (const [key, value] of info.script.generated.embeddedCodes) {
58
57
  if (key.startsWith('script_')) {
59
58
  script = value;
60
59
  break;
@@ -0,0 +1,4 @@
1
+ import type * as html from 'vscode-html-languageservice';
2
+ export declare function loadTemplateData(lang: string): html.HTMLDataV1;
3
+ export declare function loadLanguageBlocks(lang: string): html.HTMLDataV1;
4
+ export declare function loadModelModifiersData(lang: string): html.HTMLDataV1;
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTemplateData = loadTemplateData;
4
+ exports.loadLanguageBlocks = loadLanguageBlocks;
5
+ exports.loadModelModifiersData = loadModelModifiersData;
6
+ let locale;
7
+ function loadTemplateData(lang) {
8
+ lang = lang.toLowerCase();
9
+ let data;
10
+ if (lang === 'ja') {
11
+ data = require('../../data/template/ja.json');
12
+ }
13
+ else if (lang === 'fr') {
14
+ data = require('../../data/template/fr.json');
15
+ }
16
+ else if (lang === 'ko') {
17
+ data = require('../../data/template/ko.json');
18
+ }
19
+ else if (lang === 'pt-br') {
20
+ data = require('../../data/template/pt.json');
21
+ }
22
+ else if (lang === 'zh-cn') {
23
+ data = require('../../data/template/zh-cn.json');
24
+ }
25
+ else if (lang === 'zh-tw') {
26
+ data = require('../../data/template/zh-hk.json');
27
+ }
28
+ else if (lang === 'it') {
29
+ data = require('../../data/template/it.json');
30
+ }
31
+ else if (lang === 'cs') {
32
+ data = require('../../data/template/cs.json');
33
+ }
34
+ else if (lang === 'ru') {
35
+ data = require('../../data/template/ru.json');
36
+ }
37
+ else {
38
+ data = require('../../data/template/en.json');
39
+ }
40
+ resolveReferences(data);
41
+ // oxlint-disable-next-line no-useless-spread
42
+ for (const attr of [...data.globalAttributes ?? []]) {
43
+ if (!attr.name.startsWith('v-')) {
44
+ data.globalAttributes?.push({ ...attr, name: `:${attr.name}` }, { ...attr, name: `v-bind:${attr.name}` });
45
+ }
46
+ }
47
+ const vOn = data.globalAttributes?.find(d => d.name === 'v-on');
48
+ const vSlot = data.globalAttributes?.find(d => d.name === 'v-slot');
49
+ const vBind = data.globalAttributes?.find(d => d.name === 'v-bind');
50
+ if (vOn) {
51
+ data.globalAttributes?.push({ ...vOn, name: '@' });
52
+ }
53
+ if (vSlot) {
54
+ data.globalAttributes?.push({ ...vSlot, name: '#' });
55
+ }
56
+ if (vBind) {
57
+ data.globalAttributes?.push({ ...vBind, name: ':' });
58
+ }
59
+ return data;
60
+ }
61
+ function loadLanguageBlocks(lang) {
62
+ lang = lang.toLowerCase();
63
+ let data;
64
+ if (lang === 'ja') {
65
+ data = require('../../data/language-blocks/ja.json');
66
+ }
67
+ else if (lang === 'fr') {
68
+ data = require('../../data/language-blocks/fr.json');
69
+ }
70
+ else if (lang === 'ko') {
71
+ data = require('../../data/language-blocks/ko.json');
72
+ }
73
+ else if (lang === 'pt-br') {
74
+ data = require('../../data/language-blocks/pt.json');
75
+ }
76
+ else if (lang === 'zh-cn') {
77
+ data = require('../../data/language-blocks/zh-cn.json');
78
+ }
79
+ else if (lang === 'zh-tw') {
80
+ data = require('../../data/language-blocks/zh-hk.json');
81
+ }
82
+ else if (lang === 'it') {
83
+ data = require('../../data/language-blocks/it.json');
84
+ }
85
+ else if (lang === 'cs') {
86
+ data = require('../../data/language-blocks/cs.json');
87
+ }
88
+ else if (lang === 'ru') {
89
+ data = require('../../data/language-blocks/ru.json');
90
+ }
91
+ else {
92
+ data = require('../../data/language-blocks/en.json');
93
+ }
94
+ resolveReferences(data);
95
+ return data;
96
+ }
97
+ function loadModelModifiersData(lang) {
98
+ lang = lang.toLowerCase();
99
+ let data;
100
+ if (lang === 'ja') {
101
+ data = require('../../data/model-modifiers/ja.json');
102
+ }
103
+ else if (lang === 'fr') {
104
+ data = require('../../data/model-modifiers/fr.json');
105
+ }
106
+ else if (lang === 'ko') {
107
+ data = require('../../data/model-modifiers/ko.json');
108
+ }
109
+ else if (lang === 'pt-br') {
110
+ data = require('../../data/model-modifiers/pt.json');
111
+ }
112
+ else if (lang === 'zh-cn') {
113
+ data = require('../../data/model-modifiers/zh-cn.json');
114
+ }
115
+ else if (lang === 'zh-tw') {
116
+ data = require('../../data/model-modifiers/zh-hk.json');
117
+ }
118
+ else if (lang === 'it') {
119
+ data = require('../../data/model-modifiers/it.json');
120
+ }
121
+ else if (lang === 'cs') {
122
+ data = require('../../data/model-modifiers/cs.json');
123
+ }
124
+ else if (lang === 'ru') {
125
+ data = require('../../data/model-modifiers/ru.json');
126
+ }
127
+ else {
128
+ data = require('../../data/model-modifiers/en.json');
129
+ }
130
+ resolveReferences(data);
131
+ return data;
132
+ }
133
+ function resolveReferences(data) {
134
+ locale ??= require('../../data/locale.json');
135
+ for (const item of [
136
+ ...data.globalAttributes ?? [],
137
+ ...data.tags?.flatMap(tag => [tag, ...tag.attributes]) ?? [],
138
+ ]) {
139
+ if (typeof item.references === 'string') {
140
+ const relativeUrl = item.references;
141
+ item.references = locale.map(({ name, url }) => ({
142
+ name,
143
+ url: url + relativeUrl,
144
+ }));
145
+ }
146
+ }
147
+ }
148
+ //# sourceMappingURL=data.js.map
@@ -37,18 +37,17 @@ function create({ getEncodedSemanticClassifications }) {
37
37
  create(context) {
38
38
  return {
39
39
  async provideDocumentSemanticTokens(document, range, legend) {
40
- const info = (0, utils_1.getEmbeddedInfo)(context, document, 'main');
41
- if (!info) {
40
+ const info = (0, utils_1.resolveEmbeddedCode)(context, document.uri);
41
+ if (info?.code.id !== 'main') {
42
42
  return;
43
43
  }
44
- const { root } = info;
45
44
  const start = document.offsetAt(range.start);
46
45
  const end = document.offsetAt(range.end);
47
46
  const span = {
48
47
  start: start,
49
48
  length: end - start,
50
49
  };
51
- const classifications = await getEncodedSemanticClassifications(root.fileName, span);
50
+ const classifications = await getEncodedSemanticClassifications(info.root.fileName, span);
52
51
  if (classifications) {
53
52
  return (0, semanticTokens_1.convertClassificationsToSemanticTokens)(document, span, legend, classifications);
54
53
  }
@@ -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
1
  import type { LanguageServicePlugin } from '@volar/language-service';
2
- export declare function create(ts: typeof import('typescript'), { getPropertiesAtLocation }: import('@vue/typescript-plugin/lib/requests').Requests): LanguageServicePlugin;
2
+ export declare function create(ts: typeof import('typescript'), { isRefAtPosition }: import('@vue/typescript-plugin/lib/requests').Requests): LanguageServicePlugin;
@@ -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 utils_1 = require("../utils");
6
- function create(ts, { getPropertiesAtLocation }) {
6
+ function create(ts, { isRefAtPosition }) {
7
7
  return {
8
8
  name: 'vue-autoinsert-dotvalue',
9
9
  capabilities: {
@@ -15,8 +15,8 @@ function create(ts, { getPropertiesAtLocation }) {
15
15
  create(context) {
16
16
  return {
17
17
  async provideAutoInsertSnippet(document, selection, change) {
18
- const info = (0, utils_1.getEmbeddedInfo)(context, document, id => id.startsWith('script_'));
19
- if (!info) {
18
+ const info = (0, utils_1.resolveEmbeddedCode)(context, document.uri);
19
+ if (!info?.code.id.startsWith('script_')) {
20
20
  return;
21
21
  }
22
22
  // selection must at end of change
@@ -27,10 +27,9 @@ function create(ts, { getPropertiesAtLocation }) {
27
27
  return;
28
28
  }
29
29
  let sourceOffset;
30
- const { sourceScript, virtualCode, root } = info;
31
- const { sfc } = root;
30
+ const { sfc } = info.root;
32
31
  const scriptBlocks = [sfc.script, sfc.scriptSetup].filter(block => !!block);
33
- const map = context.language.maps.get(virtualCode, sourceScript);
32
+ const map = context.language.maps.get(info.code, info.script);
34
33
  if (!scriptBlocks.length) {
35
34
  return;
36
35
  }
@@ -49,8 +48,7 @@ function create(ts, { getPropertiesAtLocation }) {
49
48
  return;
50
49
  }
51
50
  }
52
- const props = await getPropertiesAtLocation(root.fileName, sourceOffset) ?? [];
53
- if (props.some(prop => prop === 'value')) {
51
+ if (await isRefAtPosition(info.root.fileName, sourceOffset)) {
54
52
  return '${1:.value}';
55
53
  }
56
54
  },
@@ -14,12 +14,11 @@ function create() {
14
14
  create(context) {
15
15
  return {
16
16
  provideDiagnostics(document) {
17
- const info = (0, utils_1.getEmbeddedInfo)(context, document, 'template');
18
- if (!info) {
17
+ const info = (0, utils_1.resolveEmbeddedCode)(context, document.uri);
18
+ if (info?.code.id !== 'template') {
19
19
  return;
20
20
  }
21
- const { root } = info;
22
- const { template } = root.sfc;
21
+ const { template } = info.root.sfc;
23
22
  if (!template) {
24
23
  return;
25
24
  }
@@ -0,0 +1,2 @@
1
+ import type { LanguageServicePlugin } from '@volar/language-service';
2
+ export declare function create(): LanguageServicePlugin;
@@ -0,0 +1,84 @@
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
+ const utils_1 = require("./utils");
7
+ function create() {
8
+ return {
9
+ name: 'vue-complete-define-assignment',
10
+ capabilities: {
11
+ completionProvider: {},
12
+ },
13
+ create(context) {
14
+ return {
15
+ isAdditionalCompletion: true,
16
+ async provideCompletionItems(document) {
17
+ if (!(0, utils_1.isTsDocument)(document)) {
18
+ return;
19
+ }
20
+ const enabled = await context.env.getConfiguration?.('vue.suggest.defineAssignment') ?? true;
21
+ if (!enabled) {
22
+ return;
23
+ }
24
+ const uri = vscode_uri_1.URI.parse(document.uri);
25
+ const decoded = context.decodeEmbeddedDocumentUri(uri);
26
+ const sourceScript = decoded && context.language.scripts.get(decoded[0]);
27
+ const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
28
+ if (!sourceScript?.generated || !virtualCode) {
29
+ return;
30
+ }
31
+ const root = sourceScript.generated.root;
32
+ if (!(root instanceof language_core_1.VueVirtualCode)) {
33
+ return;
34
+ }
35
+ const { sfc } = root;
36
+ const codegen = language_core_1.tsCodegen.get(sfc);
37
+ const scriptSetup = sfc.scriptSetup;
38
+ const scriptSetupRanges = codegen?.getScriptSetupRanges();
39
+ if (!scriptSetup || !scriptSetupRanges) {
40
+ return;
41
+ }
42
+ const result = [];
43
+ const mappings = [...context.language.maps.forEach(virtualCode)];
44
+ addDefineCompletionItem(scriptSetupRanges.defineProps?.statement, scriptSetupRanges.withDefaults?.exp ?? scriptSetupRanges.defineProps?.exp, 'props');
45
+ addDefineCompletionItem(scriptSetupRanges.defineEmits?.statement, scriptSetupRanges.defineEmits?.exp, 'emit');
46
+ addDefineCompletionItem(scriptSetupRanges.defineSlots?.statement, scriptSetupRanges.defineSlots?.exp, 'slots');
47
+ return {
48
+ isIncomplete: false,
49
+ items: result,
50
+ };
51
+ function addDefineCompletionItem(statement, exp, name) {
52
+ if (!exp || exp.start !== statement?.start) {
53
+ return;
54
+ }
55
+ let offset;
56
+ for (const [, map] of mappings) {
57
+ for (const [generatedOffset] of map.toGeneratedLocation(scriptSetup.startTagEnd + exp.start)) {
58
+ offset = generatedOffset;
59
+ break;
60
+ }
61
+ }
62
+ if (offset === undefined) {
63
+ return;
64
+ }
65
+ const pos = document.positionAt(offset);
66
+ result.push({
67
+ label: name,
68
+ kind: 6,
69
+ commitCharacters: ['.', ',', ';'],
70
+ additionalTextEdits: [{
71
+ newText: `const ${name} = `,
72
+ range: {
73
+ start: pos,
74
+ end: pos,
75
+ },
76
+ }],
77
+ });
78
+ }
79
+ },
80
+ };
81
+ },
82
+ };
83
+ }
84
+ //# sourceMappingURL=vue-complete-define-assignment.js.map
@@ -17,20 +17,19 @@ function create({ getComponentNames, getElementNames }) {
17
17
  create(context) {
18
18
  return {
19
19
  async provideDocumentSemanticTokens(document, range, legend) {
20
- const info = (0, utils_1.getEmbeddedInfo)(context, document, 'template');
21
- if (!info) {
20
+ const info = (0, utils_1.resolveEmbeddedCode)(context, document.uri);
21
+ if (info?.code.id !== 'template') {
22
22
  return;
23
23
  }
24
- const { root } = info;
25
- const { template } = root.sfc;
24
+ const { template } = info.root.sfc;
26
25
  if (!template?.ast) {
27
26
  return;
28
27
  }
29
28
  const componentSpans = [];
30
29
  const start = document.offsetAt(range.start);
31
30
  const end = document.offsetAt(range.end);
32
- const validComponentNames = await getComponentNames(root.fileName) ?? [];
33
- const elements = new Set(await getElementNames(root.fileName) ?? []);
31
+ const validComponentNames = await getComponentNames(info.root.fileName) ?? [];
32
+ const elements = new Set(await getElementNames(info.root.fileName) ?? []);
34
33
  const components = new Set([
35
34
  ...validComponentNames,
36
35
  ...validComponentNames.map(language_core_1.hyphenateTag),
@@ -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][];