@volar/typescript 2.0.4 → 2.1.1

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.
@@ -1,4 +1,4 @@
1
- import { type FileRegistry } from '@volar/language-core';
1
+ import type { FileRegistry } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
- export declare function decorateLanguageServiceHost(virtualFiles: FileRegistry, languageServiceHost: ts.LanguageServiceHost, ts: typeof import('typescript')): void;
3
+ export declare function decorateLanguageServiceHost(files: FileRegistry, languageServiceHost: ts.LanguageServiceHost, ts: typeof import('typescript')): void;
4
4
  export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
4
- const language_core_1 = require("@volar/language-core");
5
4
  const resolveModuleName_1 = require("../resolveModuleName");
6
- function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
5
+ function decorateLanguageServiceHost(files, languageServiceHost, ts) {
7
6
  let extraProjectVersion = 0;
8
- const { languagePlugins } = virtualFiles;
7
+ const { languagePlugins } = files;
9
8
  const exts = languagePlugins
10
9
  .map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
11
10
  .flat();
@@ -15,6 +14,7 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
15
14
  const resolveModuleNames = languageServiceHost.resolveModuleNames?.bind(languageServiceHost);
16
15
  const getProjectVersion = languageServiceHost.getProjectVersion?.bind(languageServiceHost);
17
16
  const getScriptSnapshot = languageServiceHost.getScriptSnapshot.bind(languageServiceHost);
17
+ const getScriptVersion = languageServiceHost.getScriptVersion.bind(languageServiceHost);
18
18
  const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
19
19
  // path completion
20
20
  if (readDirectory) {
@@ -30,25 +30,25 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
30
30
  };
31
31
  }
32
32
  if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
33
- const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => virtualFiles.get(fileName));
33
+ const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => files.get(fileName));
34
34
  if (resolveModuleNameLiterals) {
35
35
  languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, ...rest) => {
36
- return [
37
- ...resolveModuleNameLiterals(moduleLiterals.filter(name => !exts.some(ext => name.text.endsWith(ext))), containingFile, redirectedReference, options, ...rest),
38
- ...moduleLiterals
39
- .filter(name => exts.some(ext => name.text.endsWith(ext)))
40
- .map(name => resolveModuleName(name.text, containingFile, options, undefined, redirectedReference)),
41
- ];
36
+ if (moduleLiterals.every(name => !exts.some(ext => name.text.endsWith(ext)))) {
37
+ return resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, ...rest);
38
+ }
39
+ return moduleLiterals.map(moduleLiteral => {
40
+ return resolveModuleName(moduleLiteral.text, containingFile, options, undefined, redirectedReference);
41
+ });
42
42
  };
43
43
  }
44
44
  if (resolveModuleNames) {
45
45
  languageServiceHost.resolveModuleNames = (moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile) => {
46
- return [
47
- ...resolveModuleNames(moduleNames.filter(name => !exts.some(ext => name.endsWith(ext))), containingFile, reusedNames, redirectedReference, options, containingSourceFile),
48
- ...moduleNames
49
- .filter(name => exts.some(ext => name.endsWith(ext)))
50
- .map(moduleName => resolveModuleName(moduleName, containingFile, options, undefined, redirectedReference).resolvedModule),
51
- ];
46
+ if (moduleNames.every(name => !exts.some(ext => name.endsWith(ext)))) {
47
+ return resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile);
48
+ }
49
+ return moduleNames.map(moduleName => {
50
+ return resolveModuleName(moduleName, containingFile, options, undefined, redirectedReference).resolvedModule;
51
+ });
52
52
  };
53
53
  }
54
54
  }
@@ -64,6 +64,13 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
64
64
  }
65
65
  return getScriptSnapshot(fileName);
66
66
  };
67
+ languageServiceHost.getScriptVersion = fileName => {
68
+ if (exts.some(ext => fileName.endsWith(ext))) {
69
+ updateScript(fileName);
70
+ return scripts.get(fileName)?.version.toString() ?? '';
71
+ }
72
+ return getScriptVersion(fileName);
73
+ };
67
74
  if (getScriptKind) {
68
75
  languageServiceHost.getScriptKind = fileName => {
69
76
  if (exts.some(ext => fileName.endsWith(ext))) {
@@ -78,40 +85,52 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
78
85
  };
79
86
  }
80
87
  function updateScript(fileName) {
81
- const version = languageServiceHost.getScriptVersion(fileName);
82
- if (version !== scripts.get(fileName)?.version) {
83
- let extension = '.ts';
84
- let snapshotSnapshot;
85
- let scriptKind = ts.ScriptKind.TS;
86
- const snapshot = getScriptSnapshot(fileName);
87
- if (snapshot) {
88
+ const version = getProjectVersion?.();
89
+ const cache = scripts.get(fileName);
90
+ if (version === undefined || version !== cache?.projectVersion) {
91
+ const file = files.get(fileName);
92
+ const script = file?.generated?.languagePlugin.typescript?.getScript(file.generated.code);
93
+ if (script?.code.snapshot !== cache?.snapshot) {
94
+ let extension = '.ts';
95
+ let snapshotSnapshot;
96
+ let scriptKind = ts.ScriptKind.TS;
88
97
  extraProjectVersion++;
89
- const sourceFile = virtualFiles.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
90
- if (sourceFile.generated) {
91
- const text = snapshot.getText(0, snapshot.getLength());
92
- let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
93
- const script = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
94
- if (script) {
98
+ if (script) {
99
+ if (file?.generated) {
100
+ const text = file.snapshot.getText(0, file.snapshot.getLength());
101
+ let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
95
102
  extension = script.extension;
96
103
  scriptKind = script.scriptKind;
97
104
  patchedText += script.code.snapshot.getText(0, script.code.snapshot.getLength());
105
+ snapshotSnapshot = ts.ScriptSnapshot.fromString(patchedText);
106
+ if (file.generated.languagePlugin.typescript?.getExtraScripts) {
107
+ console.warn('getExtraScripts() is not available in this use case.');
108
+ }
98
109
  }
99
- snapshotSnapshot = ts.ScriptSnapshot.fromString(patchedText);
100
- if (sourceFile.generated.languagePlugin.typescript?.getExtraScripts) {
101
- console.warn('getExtraScripts() is not available in this use case.');
102
- }
110
+ }
111
+ else if (files.get(fileName)) {
112
+ files.delete(fileName);
113
+ }
114
+ if (!cache) {
115
+ scripts.set(fileName, {
116
+ projectVersion: version,
117
+ version: 0,
118
+ extension,
119
+ snapshot: snapshotSnapshot,
120
+ kind: scriptKind,
121
+ });
122
+ }
123
+ else {
124
+ cache.projectVersion = version;
125
+ cache.version++;
126
+ cache.extension = extension;
127
+ cache.snapshot = snapshotSnapshot;
128
+ cache.kind = scriptKind;
103
129
  }
104
130
  }
105
- else if (virtualFiles.get(fileName)) {
106
- extraProjectVersion++;
107
- virtualFiles.delete(fileName);
131
+ else if (cache) {
132
+ cache.projectVersion = version;
108
133
  }
109
- scripts.set(fileName, {
110
- version,
111
- extension,
112
- snapshot: snapshotSnapshot,
113
- kind: scriptKind,
114
- });
115
134
  }
116
135
  return scripts.get(fileName);
117
136
  }
@@ -1,6 +1,6 @@
1
- import type { ServiceEnvironment, Disposable, TypeScriptProjectHost } from '@volar/language-service';
1
+ import type { ServiceEnvironment, Disposable } from '@volar/language-service';
2
2
  import type * as ts from 'typescript';
3
- export declare function createSys(ts: typeof import('typescript'), env: ServiceEnvironment, projectHost: TypeScriptProjectHost): ts.System & {
3
+ export declare function createSys(ts: typeof import('typescript'), env: ServiceEnvironment, currentDirectory: string): ts.System & {
4
4
  version: number;
5
5
  sync(): Promise<number>;
6
6
  } & Disposable;
@@ -4,9 +4,8 @@ exports.createSys = void 0;
4
4
  const path = require("path-browserify");
5
5
  const utilities_1 = require("../typescript/utilities");
6
6
  let currentCwd = '';
7
- function createSys(ts, env, projectHost) {
7
+ function createSys(ts, env, currentDirectory) {
8
8
  let version = 0;
9
- const rootPath = projectHost.getCurrentDirectory();
10
9
  const sys = ts.sys;
11
10
  const root = {
12
11
  dirs: new Map(),
@@ -56,8 +55,8 @@ function createSys(ts, env, projectHost) {
56
55
  writeFile: sys?.writeFile ?? (() => { }),
57
56
  createDirectory: sys?.createDirectory ?? (() => { }),
58
57
  exit: sys?.exit ?? (() => { }),
59
- getExecutingFilePath: sys?.getExecutingFilePath ?? (() => rootPath + '/__fake__.js'),
60
- getCurrentDirectory: () => rootPath,
58
+ getExecutingFilePath: sys?.getExecutingFilePath ?? (() => currentDirectory + '/__fake__.js'),
59
+ getCurrentDirectory: () => currentDirectory,
61
60
  getModifiedTime,
62
61
  readFile,
63
62
  readDirectory,
@@ -77,15 +76,15 @@ function createSys(ts, env, projectHost) {
77
76
  };
78
77
  function resolvePath(fsPath) {
79
78
  if (sys) {
80
- if (currentCwd !== rootPath) {
81
- currentCwd = rootPath;
79
+ if (currentCwd !== currentDirectory) {
80
+ currentCwd = currentDirectory;
82
81
  // https://github.com/vuejs/language-tools/issues/2039
83
82
  // https://github.com/vuejs/language-tools/issues/2234
84
- if (sys.directoryExists(rootPath)) {
83
+ if (sys.directoryExists(currentDirectory)) {
85
84
  // https://github.com/vuejs/language-tools/issues/2480
86
85
  try {
87
86
  // @ts-ignore
88
- process.chdir(rootPath);
87
+ process.chdir(currentDirectory);
89
88
  }
90
89
  catch { }
91
90
  }
@@ -184,7 +183,7 @@ function createSys(ts, env, projectHost) {
184
183
  }
185
184
  function readDirectory(dirName, extensions, excludes, includes, depth) {
186
185
  dirName = resolvePath(dirName);
187
- const matches = (0, utilities_1.matchFiles)(dirName, extensions, excludes, includes, sys?.useCaseSensitiveFileNames ?? false, rootPath, depth, dirPath => {
186
+ const matches = (0, utilities_1.matchFiles)(dirName, extensions, excludes, includes, sys?.useCaseSensitiveFileNames ?? false, currentDirectory, depth, dirPath => {
188
187
  dirPath = resolvePath(dirPath);
189
188
  readDirectoryWorker(dirPath);
190
189
  const dir = getDir(dirPath);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.0.4",
3
+ "version": "2.1.1",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,13 +12,13 @@
12
12
  "directory": "packages/typescript"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/language-core": "2.0.4",
15
+ "@volar/language-core": "2.1.1",
16
16
  "path-browserify": "^1.0.1"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/node": "latest",
20
20
  "@types/path-browserify": "latest",
21
- "@volar/language-service": "2.0.4"
21
+ "@volar/language-service": "2.1.1"
22
22
  },
23
- "gitHead": "b3dc544424c95f8b72e832fbaa0f85a34442389b"
23
+ "gitHead": "e56916097fe7be2920aab6592a564a8e2ceafd14"
24
24
  }