@volar/typescript 2.0.3 → 2.1.0
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/lib/node/decorateLanguageService.js +1 -1
- package/lib/node/decorateLanguageServiceHost.js +23 -55
- package/lib/protocol/createProject.js +12 -36
- package/lib/protocol/createSys.d.ts +2 -2
- package/lib/protocol/createSys.js +8 -9
- package/lib/resolveModuleName.d.ts +3 -0
- package/lib/resolveModuleName.js +56 -0
- package/package.json +4 -4
|
@@ -293,7 +293,7 @@ function decorateLanguageService(files, languageService) {
|
|
|
293
293
|
return result;
|
|
294
294
|
}
|
|
295
295
|
else {
|
|
296
|
-
return getEncodedSemanticClassifications(fileName, span);
|
|
296
|
+
return getEncodedSemanticClassifications(fileName, span, format);
|
|
297
297
|
}
|
|
298
298
|
};
|
|
299
299
|
languageService.getSyntacticDiagnostics = fileName => {
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
|
+
const resolveModuleName_1 = require("../resolveModuleName");
|
|
5
6
|
function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
|
|
6
7
|
let extraProjectVersion = 0;
|
|
7
|
-
const
|
|
8
|
+
const { languagePlugins } = virtualFiles;
|
|
9
|
+
const exts = languagePlugins
|
|
8
10
|
.map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
|
|
9
11
|
.flat();
|
|
10
12
|
const scripts = new Map();
|
|
@@ -27,33 +29,28 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
|
|
|
27
29
|
return readDirectory(path, extensions, exclude, include, depth);
|
|
28
30
|
};
|
|
29
31
|
}
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (exts.some(ext => name.text.endsWith(ext))) {
|
|
35
|
-
|
|
36
|
-
if (resolved.resolvedModule) {
|
|
37
|
-
return resolved;
|
|
38
|
-
}
|
|
32
|
+
if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
|
|
33
|
+
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => virtualFiles.get(fileName));
|
|
34
|
+
if (resolveModuleNameLiterals) {
|
|
35
|
+
languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, ...rest) => {
|
|
36
|
+
if (moduleLiterals.every(name => !exts.some(ext => name.text.endsWith(ext)))) {
|
|
37
|
+
return resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, ...rest);
|
|
39
38
|
}
|
|
40
|
-
return
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const resolved = resolveModuleName(name, containingFile, options, redirectedReference);
|
|
50
|
-
if (resolved.resolvedModule) {
|
|
51
|
-
return resolved.resolvedModule;
|
|
52
|
-
}
|
|
39
|
+
return moduleLiterals.map(moduleLiteral => {
|
|
40
|
+
return resolveModuleName(moduleLiteral.text, containingFile, options, undefined, redirectedReference);
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (resolveModuleNames) {
|
|
45
|
+
languageServiceHost.resolveModuleNames = (moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile) => {
|
|
46
|
+
if (moduleNames.every(name => !exts.some(ext => name.endsWith(ext)))) {
|
|
47
|
+
return resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile);
|
|
53
48
|
}
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
return moduleNames.map(moduleName => {
|
|
50
|
+
return resolveModuleName(moduleName, containingFile, options, undefined, redirectedReference).resolvedModule;
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
}
|
|
57
54
|
}
|
|
58
55
|
if (getProjectVersion) {
|
|
59
56
|
languageServiceHost.getProjectVersion = () => {
|
|
@@ -80,35 +77,6 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
|
|
|
80
77
|
return getScriptKind(fileName);
|
|
81
78
|
};
|
|
82
79
|
}
|
|
83
|
-
function resolveModuleName(name, containingFile, options, redirectedReference) {
|
|
84
|
-
const resolved = ts.resolveModuleName(name, containingFile, options, {
|
|
85
|
-
readFile(fileName) {
|
|
86
|
-
return languageServiceHost.readFile(fileName);
|
|
87
|
-
},
|
|
88
|
-
fileExists(fileName) {
|
|
89
|
-
if (exts.some(ext => fileName.endsWith(ext + '.d.ts'))) {
|
|
90
|
-
return fileExists(fileName.slice(0, -'.d.ts'.length));
|
|
91
|
-
}
|
|
92
|
-
return languageServiceHost.fileExists(fileName);
|
|
93
|
-
},
|
|
94
|
-
}, undefined, redirectedReference);
|
|
95
|
-
if (resolved.resolvedModule) {
|
|
96
|
-
resolved.resolvedModule.resolvedFileName = resolved.resolvedModule.resolvedFileName.slice(0, -'.d.ts'.length);
|
|
97
|
-
const script = updateScript(resolved.resolvedModule.resolvedFileName);
|
|
98
|
-
if (script) {
|
|
99
|
-
resolved.resolvedModule.extension = script.extension;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return resolved;
|
|
103
|
-
}
|
|
104
|
-
// fix https://github.com/vuejs/language-tools/issues/3332
|
|
105
|
-
function fileExists(fileName) {
|
|
106
|
-
if (languageServiceHost.fileExists(fileName)) {
|
|
107
|
-
const fileSize = ts.sys.getFileSize?.(fileName) ?? languageServiceHost.readFile(fileName)?.length ?? 0;
|
|
108
|
-
return fileSize < 4 * 1024 * 1024;
|
|
109
|
-
}
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
80
|
function updateScript(fileName) {
|
|
113
81
|
const version = languageServiceHost.getScriptVersion(fileName);
|
|
114
82
|
if (version !== scripts.get(fileName)?.version) {
|
|
@@ -4,6 +4,7 @@ exports.createLanguage = void 0;
|
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const language_core_2 = require("@volar/language-core");
|
|
6
6
|
const path = require("path-browserify");
|
|
7
|
+
const resolveModuleName_1 = require("../resolveModuleName");
|
|
7
8
|
const scriptVersions = new Map();
|
|
8
9
|
const fsFileSnapshots = new Map();
|
|
9
10
|
function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, { fileIdToFileName, fileNameToFileId }) {
|
|
@@ -43,6 +44,7 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
|
|
|
43
44
|
if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
|
|
44
45
|
// TODO: can this share between monorepo packages?
|
|
45
46
|
const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
|
|
47
|
+
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => files.get(fileNameToFileId(fileName)));
|
|
46
48
|
let lastSysVersion = 'version' in sys ? sys.version : undefined;
|
|
47
49
|
languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, sourceFile) => {
|
|
48
50
|
if ('version' in sys && lastSysVersion !== sys.version) {
|
|
@@ -50,42 +52,16 @@ function createLanguage(ts, sys, languagePlugins, configFileName, projectHost, {
|
|
|
50
52
|
moduleCache.clear();
|
|
51
53
|
}
|
|
52
54
|
return moduleLiterals.map(moduleLiteral => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
...languageServiceHost,
|
|
64
|
-
fileExists(fileName) {
|
|
65
|
-
if (extraFileExtension && fileName.endsWith(`.d.${extraFileExtension}.ts`)) {
|
|
66
|
-
const patchResult = languageServiceHost.fileExists(fileName.slice(0, -`.d.${extraFileExtension}.ts`.length)
|
|
67
|
-
+ `.${extraFileExtension}`);
|
|
68
|
-
if (patchResult) {
|
|
69
|
-
isPatchResult = true;
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return sys.fileExists(fileName);
|
|
74
|
-
},
|
|
75
|
-
}, moduleCache, redirectedReference, sourceFile.impliedNodeFormat);
|
|
76
|
-
if (isPatchResult && result.resolvedModule) {
|
|
77
|
-
result.resolvedModule.resolvedFileName = result.resolvedModule.resolvedFileName
|
|
78
|
-
.slice(0, -`.d.${extraFileExtension}.ts`.length)
|
|
79
|
-
+ `.${extraFileExtension}`;
|
|
80
|
-
const sourceFile = files.get(fileNameToFileId(result.resolvedModule.resolvedFileName));
|
|
81
|
-
if (sourceFile?.generated) {
|
|
82
|
-
const tsCode = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
|
|
83
|
-
if (tsCode) {
|
|
84
|
-
result.resolvedModule.extension = tsCode.extension;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return result;
|
|
55
|
+
return resolveModuleName(moduleLiteral.text, containingFile, options, moduleCache, redirectedReference, sourceFile.impliedNodeFormat);
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
languageServiceHost.resolveModuleNames = (moduleNames, containingFile, _reusedNames, redirectedReference, options) => {
|
|
59
|
+
if ('version' in sys && lastSysVersion !== sys.version) {
|
|
60
|
+
lastSysVersion = sys.version;
|
|
61
|
+
moduleCache.clear();
|
|
62
|
+
}
|
|
63
|
+
return moduleNames.map(moduleName => {
|
|
64
|
+
return resolveModuleName(moduleName, containingFile, options, moduleCache, redirectedReference).resolvedModule;
|
|
89
65
|
});
|
|
90
66
|
};
|
|
91
67
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { ServiceEnvironment, Disposable
|
|
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,
|
|
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,
|
|
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 ?? (() =>
|
|
60
|
-
getCurrentDirectory: () =>
|
|
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 !==
|
|
81
|
-
currentCwd =
|
|
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(
|
|
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(
|
|
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,
|
|
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);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LanguagePlugin, SourceFile } from '@volar/language-core';
|
|
2
|
+
import type * as ts from 'typescript';
|
|
3
|
+
export declare function createResolveModuleName(ts: typeof import('typescript'), languageServiceHost: ts.LanguageServiceHost, languagePlugins: LanguagePlugin<any>[], getFile: (fileName: string) => SourceFile | undefined): (moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions, cache?: ts.ModuleResolutionCache, redirectedReference?: ts.ResolvedProjectReference, resolutionMode?: ts.ResolutionMode) => ts.ResolvedModuleWithFailedLookupLocations;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createResolveModuleName = void 0;
|
|
4
|
+
function createResolveModuleName(ts, languageServiceHost, languagePlugins, getFile) {
|
|
5
|
+
const toPatchResults = new Map();
|
|
6
|
+
const moduleResolutionHost = {
|
|
7
|
+
readFile: languageServiceHost.readFile.bind(languageServiceHost),
|
|
8
|
+
directoryExists: languageServiceHost.directoryExists?.bind(languageServiceHost),
|
|
9
|
+
realpath: languageServiceHost.realpath?.bind(languageServiceHost),
|
|
10
|
+
getCurrentDirectory: languageServiceHost.getCurrentDirectory.bind(languageServiceHost),
|
|
11
|
+
getDirectories: languageServiceHost.getDirectories?.bind(languageServiceHost),
|
|
12
|
+
useCaseSensitiveFileNames: languageServiceHost.useCaseSensitiveFileNames?.bind(languageServiceHost),
|
|
13
|
+
fileExists(fileName) {
|
|
14
|
+
for (const { typescript } of languagePlugins) {
|
|
15
|
+
if (!typescript) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
for (const { extension } of typescript.extraFileExtensions) {
|
|
19
|
+
if (fileName.endsWith(`.d.${extension}.ts`)) {
|
|
20
|
+
const patchFileName = fileName.slice(0, -`.d.${extension}.ts`.length) + `.${extension}`;
|
|
21
|
+
if (fileExists(patchFileName)) {
|
|
22
|
+
toPatchResults.set(fileName, patchFileName);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return languageServiceHost.fileExists(fileName);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
return (moduleName, containingFile, compilerOptions, cache, redirectedReference, resolutionMode) => {
|
|
32
|
+
const result = ts.resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost, cache, redirectedReference, resolutionMode);
|
|
33
|
+
if (result.resolvedModule && toPatchResults.has(result.resolvedModule.resolvedFileName)) {
|
|
34
|
+
result.resolvedModule.resolvedFileName = toPatchResults.get(result.resolvedModule.resolvedFileName);
|
|
35
|
+
const sourceFile = getFile(result.resolvedModule.resolvedFileName);
|
|
36
|
+
if (sourceFile?.generated) {
|
|
37
|
+
const tsCode = sourceFile.generated.languagePlugin.typescript?.getScript(sourceFile.generated.code);
|
|
38
|
+
if (tsCode) {
|
|
39
|
+
result.resolvedModule.extension = tsCode.extension;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
toPatchResults.clear();
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
// fix https://github.com/vuejs/language-tools/issues/3332
|
|
47
|
+
function fileExists(fileName) {
|
|
48
|
+
if (languageServiceHost.fileExists(fileName)) {
|
|
49
|
+
const fileSize = ts.sys.getFileSize?.(fileName) ?? languageServiceHost.readFile(fileName)?.length ?? 0;
|
|
50
|
+
return fileSize < 4 * 1024 * 1024;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.createResolveModuleName = createResolveModuleName;
|
|
56
|
+
//# sourceMappingURL=resolveModuleName.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
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
|
|
15
|
+
"@volar/language-core": "2.1.0",
|
|
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
|
|
21
|
+
"@volar/language-service": "2.1.0"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "09e1792f0adafb02caf89a5a45a6fcaaf3177808"
|
|
24
24
|
}
|