@vue/typescript-plugin 2.0.19 → 2.0.21

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.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- import type * as ts from 'typescript';
2
- declare const _default: ts.server.PluginModuleFactory;
3
- export = _default;
1
+ declare const plugin: import("typescript").server.PluginModuleFactory;
2
+ export = plugin;
package/index.js CHANGED
@@ -1,100 +1,44 @@
1
1
  "use strict";
2
- const decorateLanguageService_1 = require("@volar/typescript/lib/node/decorateLanguageService");
3
- const decorateLanguageServiceHost_1 = require("@volar/typescript/lib/node/decorateLanguageServiceHost");
2
+ const createLanguageServicePlugin_1 = require("@volar/typescript/lib/quickstart/createLanguageServicePlugin");
4
3
  const vue = require("@vue/language-core");
5
- const language_core_1 = require("@vue/language-core");
6
4
  const common_1 = require("./lib/common");
7
5
  const server_1 = require("./lib/server");
8
6
  const windowsPathReg = /\\/g;
9
- const externalFiles = new WeakMap();
10
- const projectExternalFileExtensions = new WeakMap();
11
- const decoratedLanguageServices = new WeakSet();
12
- const decoratedLanguageServiceHosts = new WeakSet();
13
- function createLanguageServicePlugin() {
14
- return modules => {
15
- const { typescript: ts } = modules;
16
- const pluginModule = {
17
- create(info) {
18
- if (!decoratedLanguageServices.has(info.languageService)
19
- && !decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
20
- decoratedLanguageServices.add(info.languageService);
21
- decoratedLanguageServiceHosts.add(info.languageServiceHost);
22
- const vueOptions = getVueCompilerOptions();
23
- const languagePlugin = vue.createVueLanguagePlugin(ts, id => id, info.languageServiceHost.useCaseSensitiveFileNames?.() ?? false, () => info.languageServiceHost.getProjectVersion?.() ?? '', () => externalFiles.get(info.project) ?? [], info.languageServiceHost.getCompilationSettings(), vueOptions);
24
- const extensions = languagePlugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [];
25
- const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
26
- const getScriptVersion = info.languageServiceHost.getScriptVersion.bind(info.languageServiceHost);
27
- const syncedScriptVersions = new vue.FileMap(ts.sys.useCaseSensitiveFileNames);
28
- const language = (0, language_core_1.createLanguage)([languagePlugin], ts.sys.useCaseSensitiveFileNames, fileName => {
29
- const version = getScriptVersion(fileName);
30
- if (syncedScriptVersions.get(fileName) === version) {
31
- return;
32
- }
33
- syncedScriptVersions.set(fileName, version);
34
- const snapshot = getScriptSnapshot(fileName);
35
- if (snapshot) {
36
- language.scripts.set(fileName, snapshot);
37
- }
38
- else {
39
- language.scripts.delete(fileName);
40
- }
41
- });
42
- projectExternalFileExtensions.set(info.project, extensions);
43
- server_1.projects.set(info.project, { info, language, vueOptions });
44
- (0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
45
- (0, common_1.decorateLanguageServiceForVue)(language, info.languageService, vueOptions, ts, true, fileName => fileName);
46
- (0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
47
- (0, server_1.startNamedPipeServer)(ts, info.project.projectKind, info.project.getCurrentDirectory());
48
- // #3963
49
- const timer = setInterval(() => {
50
- if (info.project['program']) {
51
- clearInterval(timer);
52
- info.project['program'].__vue__ = { language };
53
- }
54
- }, 50);
7
+ const plugin = (0, createLanguageServicePlugin_1.createLanguageServicePlugin)((ts, info) => {
8
+ const vueOptions = getVueCompilerOptions();
9
+ const languagePlugin = vue.createVueLanguagePlugin(ts, id => id, () => info.languageServiceHost.getProjectVersion?.() ?? '', info.project.projectKind === ts.server.ProjectKind.Inferred
10
+ ? () => true
11
+ : fileName => {
12
+ const fileMap = new vue.FileMap(info.languageServiceHost.useCaseSensitiveFileNames?.() ?? false);
13
+ for (const vueFileName of createLanguageServicePlugin_1.externalFiles.get(info.project) ?? []) {
14
+ fileMap.set(vueFileName, undefined);
15
+ }
16
+ return fileMap.has(fileName);
17
+ }, info.languageServiceHost.getCompilationSettings(), vueOptions);
18
+ return {
19
+ languagePlugins: [languagePlugin],
20
+ setup: language => {
21
+ server_1.projects.set(info.project, { info, language, vueOptions });
22
+ (0, common_1.decorateLanguageServiceForVue)(language, info.languageService, vueOptions, ts, true, fileName => fileName);
23
+ (0, server_1.startNamedPipeServer)(ts, info.project.projectKind, info.project.getCurrentDirectory());
24
+ // #3963
25
+ const timer = setInterval(() => {
26
+ if (info.project['program']) {
27
+ clearInterval(timer);
28
+ info.project['program'].__vue__ = { language };
55
29
  }
56
- return info.languageService;
57
- function getVueCompilerOptions() {
58
- if (info.project.projectKind === ts.server.ProjectKind.Configured) {
59
- const tsconfig = info.project.getProjectName();
60
- return vue.createParsedCommandLine(ts, ts.sys, tsconfig.replace(windowsPathReg, '/')).vueOptions;
61
- }
62
- else {
63
- return vue.createParsedCommandLineByJson(ts, ts.sys, info.languageServiceHost.getCurrentDirectory(), {}).vueOptions;
64
- }
65
- }
66
- },
67
- getExternalFiles(project, updateLevel = 0) {
68
- if (updateLevel >= (1)
69
- || !externalFiles.has(project)) {
70
- const oldFiles = externalFiles.get(project);
71
- const newFiles = new Set((0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, projectExternalFileExtensions.get(project)));
72
- externalFiles.set(project, newFiles);
73
- if (oldFiles && !twoSetsEqual(oldFiles, newFiles)) {
74
- for (const oldFile of oldFiles) {
75
- if (!newFiles.has(oldFile)) {
76
- server_1.projects.get(project)?.language.scripts.delete(oldFile);
77
- }
78
- }
79
- project.refreshDiagnostics();
80
- }
81
- }
82
- return [...externalFiles.get(project)];
83
- },
84
- };
85
- return pluginModule;
30
+ }, 50);
31
+ }
86
32
  };
87
- }
88
- function twoSetsEqual(a, b) {
89
- if (a.size !== b.size) {
90
- return false;
91
- }
92
- for (const file of a) {
93
- if (!b.has(file)) {
94
- return false;
33
+ function getVueCompilerOptions() {
34
+ if (info.project.projectKind === ts.server.ProjectKind.Configured) {
35
+ const tsconfig = info.project.getProjectName();
36
+ return vue.createParsedCommandLine(ts, ts.sys, tsconfig.replace(windowsPathReg, '/')).vueOptions;
37
+ }
38
+ else {
39
+ return vue.createParsedCommandLineByJson(ts, ts.sys, info.languageServiceHost.getCurrentDirectory(), {}).vueOptions;
95
40
  }
96
41
  }
97
- return true;
98
- }
99
- module.exports = createLanguageServicePlugin();
42
+ });
43
+ module.exports = plugin;
100
44
  //# sourceMappingURL=index.js.map
package/lib/common.d.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  import * as vue from '@vue/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateLanguageServiceForVue(language: vue.Language, languageService: ts.LanguageService, vueOptions: vue.VueCompilerOptions, ts: typeof import('typescript'), isTsPlugin: boolean, getScriptId: (fileName: string) => string): void;
4
- export declare function getComponentSpans(this: {
5
- typescript: typeof import('typescript');
6
- languageService: ts.LanguageService;
7
- }, vueCode: vue.VueVirtualCode, template: NonNullable<vue.VueVirtualCode['sfc']['template']>, spanTemplateRange: ts.TextSpan): ts.TextSpan[];
3
+ import type { RequestContext } from './requests/types';
4
+ export declare function decorateLanguageServiceForVue<T>(language: vue.Language<T>, languageService: ts.LanguageService, vueOptions: vue.VueCompilerOptions, ts: typeof import('typescript'), isTsPlugin: boolean, getScriptId: (fileName: string) => T): void;
5
+ export declare function getComponentSpans(this: Pick<RequestContext, 'typescript' | 'languageService'>, vueCode: vue.VueVirtualCode, template: NonNullable<vue.VueVirtualCode['sfc']['template']>, spanTemplateRange: ts.TextSpan): ts.TextSpan[];
package/lib/common.js CHANGED
@@ -134,11 +134,12 @@ function decorateLanguageServiceForVue(language, languageService, vueOptions, ts
134
134
  if (file?.generated?.root instanceof vue.VueVirtualCode) {
135
135
  const { template } = file.generated.root.sfc;
136
136
  if (template) {
137
- for (const componentSpan of getComponentSpans.call({ typescript: ts, languageService, vueOptions }, file.generated.root, template, {
137
+ for (const componentSpan of getComponentSpans.call({ typescript: ts, languageService }, file.generated.root, template, {
138
138
  start: span.start - template.startTagEnd,
139
139
  length: span.length,
140
140
  })) {
141
- result.spans.push(componentSpan.start + template.startTagEnd, componentSpan.length, 256);
141
+ result.spans.push(componentSpan.start + template.startTagEnd, componentSpan.length, 256 // class
142
+ );
142
143
  }
143
144
  }
144
145
  }
@@ -16,7 +16,7 @@ function collectExtractProps(fileName, templateCodeRange) {
16
16
  const sourceFile = program.getSourceFile(fileName);
17
17
  const checker = program.getTypeChecker();
18
18
  const script = volarFile.generated?.languagePlugin.typescript?.getServiceScript(volarFile.generated.root);
19
- const maps = script ? [...language.maps.forEach(script.code).values()] : [];
19
+ const maps = script ? [...language.maps.forEach(script.code)].map(([_1, _2, map]) => map) : [];
20
20
  const sfc = volarFile.generated.root.sfc;
21
21
  sourceFile.forEachChild(function visit(node) {
22
22
  if (ts.isPropertyAccessExpression(node)
@@ -24,25 +24,30 @@ function collectExtractProps(fileName, templateCodeRange) {
24
24
  && node.expression.text === '__VLS_ctx'
25
25
  && ts.isIdentifier(node.name)) {
26
26
  const { name } = node;
27
- for (const [_, map] of maps) {
28
- const source = map.getSourceOffset(name.getEnd() - (isTsPlugin ? volarFile.snapshot.getLength() : 0));
29
- if (source
30
- && source[0] >= sfc.template.startTagEnd + templateCodeRange[0]
31
- && source[0] <= sfc.template.startTagEnd + templateCodeRange[1]
32
- && (0, language_core_1.isSemanticTokensEnabled)(source[1].data)) {
33
- if (!result.has(name.text)) {
34
- const type = checker.getTypeAtLocation(node);
35
- const typeString = checker.typeToString(type, node, ts.TypeFormatFlags.NoTruncation);
36
- result.set(name.text, {
37
- name: name.text,
38
- type: typeString.includes('__VLS_') ? 'any' : typeString,
39
- model: false,
40
- });
41
- }
42
- const isModel = ts.isPostfixUnaryExpression(node.parent) || ts.isBinaryExpression(node.parent);
43
- if (isModel) {
44
- result.get(name.text).model = true;
27
+ for (const map of maps) {
28
+ let mapped = false;
29
+ for (const source of map.getSourceOffsets(name.getEnd() - (isTsPlugin ? volarFile.snapshot.getLength() : 0))) {
30
+ if (source[0] >= sfc.template.startTagEnd + templateCodeRange[0]
31
+ && source[0] <= sfc.template.startTagEnd + templateCodeRange[1]
32
+ && (0, language_core_1.isSemanticTokensEnabled)(source[1].data)) {
33
+ mapped = true;
34
+ if (!result.has(name.text)) {
35
+ const type = checker.getTypeAtLocation(node);
36
+ const typeString = checker.typeToString(type, node, ts.TypeFormatFlags.NoTruncation);
37
+ result.set(name.text, {
38
+ name: name.text,
39
+ type: typeString.includes('__VLS_') ? 'any' : typeString,
40
+ model: false,
41
+ });
42
+ }
43
+ const isModel = ts.isPostfixUnaryExpression(node.parent) || ts.isBinaryExpression(node.parent);
44
+ if (isModel) {
45
+ result.get(name.text).model = true;
46
+ }
47
+ break;
45
48
  }
49
+ }
50
+ if (mapped) {
46
51
  break;
47
52
  }
48
53
  }
@@ -2,28 +2,8 @@ import * as vue from '@vue/language-core';
2
2
  import type * as ts from 'typescript';
3
3
  import type { RequestContext } from './types';
4
4
  export declare function getComponentProps(this: RequestContext, fileName: string, tag: string, requiredOnly?: boolean): string[] | undefined;
5
- export declare function getComponentEvents(this: {
6
- typescript: typeof import('typescript');
7
- languageService: ts.LanguageService;
8
- language: vue.Language;
9
- getFileId: (fileName: string) => string;
10
- }, fileName: string, tag: string): string[] | undefined;
11
- export declare function getTemplateContextProps(this: {
12
- typescript: typeof import('typescript');
13
- languageService: ts.LanguageService;
14
- language: vue.Language;
15
- getFileId: (fileName: string) => string;
16
- }, fileName: string): string[] | undefined;
17
- export declare function getComponentNames(this: {
18
- typescript: typeof import('typescript');
19
- languageService: ts.LanguageService;
20
- language: vue.Language;
21
- getFileId: (fileName: string) => string;
22
- }, fileName: string): string[] | undefined;
5
+ export declare function getComponentEvents(this: RequestContext, fileName: string, tag: string): string[] | undefined;
6
+ export declare function getTemplateContextProps(this: RequestContext, fileName: string): string[] | undefined;
7
+ export declare function getComponentNames(this: RequestContext, fileName: string): string[] | undefined;
23
8
  export declare function _getComponentNames(ts: typeof import('typescript'), tsLs: ts.LanguageService, vueCode: vue.VueVirtualCode): string[];
24
- export declare function getElementAttrs(this: {
25
- typescript: typeof import('typescript');
26
- languageService: ts.LanguageService;
27
- language: vue.Language;
28
- getFileId: (fileName: string) => string;
29
- }, fileName: string, tagName: string): string[] | undefined;
9
+ export declare function getElementAttrs(this: RequestContext, fileName: string, tagName: string): string[] | undefined;
@@ -12,7 +12,7 @@ function getPropertiesAtLocation(fileName, position) {
12
12
  return;
13
13
  }
14
14
  let mapped = false;
15
- for (const [_1, [_2, map]] of language.maps.forEach(virtualScript.code)) {
15
+ for (const [_1, _2, map] of language.maps.forEach(virtualScript.code)) {
16
16
  for (const [position2, mapping] of map.getGeneratedOffsets(position)) {
17
17
  if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
18
18
  position = position2;
@@ -1,10 +1,10 @@
1
1
  import type { Language } from '@vue/language-core';
2
2
  import type * as ts from 'typescript';
3
- export interface RequestContext {
3
+ export interface RequestContext<T = any> {
4
4
  typescript: typeof import('typescript');
5
5
  languageService: ts.LanguageService;
6
6
  languageServiceHost: ts.LanguageServiceHost;
7
- language: Language;
7
+ language: Language<T>;
8
8
  isTsPlugin: boolean;
9
- getFileId: (fileName: string) => string;
9
+ getFileId: (fileName: string) => T;
10
10
  }
package/lib/server.d.ts CHANGED
@@ -7,6 +7,6 @@ export interface Request {
7
7
  export declare function startNamedPipeServer(ts: typeof import('typescript'), serverKind: ts.server.ProjectKind, currentDirectory: string): void;
8
8
  export declare const projects: Map<ts.server.Project, {
9
9
  info: ts.server.PluginCreateInfo;
10
- language: Language;
10
+ language: Language<string>;
11
11
  vueOptions: VueCompilerOptions;
12
12
  }>;
package/lib/utils.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  import * as net from 'net';
3
3
  import type * as ts from 'typescript';
4
4
  import type { Request } from './server';
5
+ export { TypeScriptProjectHost } from '@volar/typescript';
5
6
  export interface NamedPipeServer {
6
7
  path: string;
7
8
  serverKind: ts.server.ProjectKind;
package/lib/utils.js CHANGED
@@ -5,6 +5,7 @@ const os = require("os");
5
5
  const net = require("net");
6
6
  const path = require("path");
7
7
  const fs = require("fs");
8
+ var typescript_1 = require("@volar/typescript");
8
9
  const { version } = require('../package.json');
9
10
  const pipeTableFile = path.join(os.tmpdir(), `vue-tsp-table-${version}.json`);
10
11
  function readPipeTable() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue/typescript-plugin",
3
- "version": "2.0.19",
3
+ "version": "2.0.21",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,12 +12,12 @@
12
12
  "directory": "packages/typescript-plugin"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/typescript": "~2.2.4",
16
- "@vue/language-core": "2.0.19",
15
+ "@volar/typescript": "~2.3.0-alpha.15",
16
+ "@vue/language-core": "2.0.21",
17
17
  "@vue/shared": "^3.4.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/node": "latest"
21
21
  },
22
- "gitHead": "a9fae154ad1efc4359866cfd10251d53e4b0faed"
22
+ "gitHead": "a5af80e3939a39694abd9dd09a5496bc5fbf6e06"
23
23
  }