@vue/language-service 1.7.8 → 1.7.10

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