@volar/typescript 2.2.0-alpha.2 → 2.2.0-alpha.4
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.
|
@@ -4,7 +4,7 @@ exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
|
|
|
4
4
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
5
5
|
function decorateLanguageServiceHost(ts, language, languageServiceHost, getLanguageId) {
|
|
6
6
|
let extraProjectVersion = 0;
|
|
7
|
-
const
|
|
7
|
+
const extensions = language.plugins
|
|
8
8
|
.map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
|
|
9
9
|
.flat();
|
|
10
10
|
const scripts = new Map();
|
|
@@ -18,7 +18,7 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLangu
|
|
|
18
18
|
if (readDirectory) {
|
|
19
19
|
languageServiceHost.readDirectory = (path, extensions, exclude, include, depth) => {
|
|
20
20
|
if (extensions) {
|
|
21
|
-
for (const ext of
|
|
21
|
+
for (const ext of extensions) {
|
|
22
22
|
if (!extensions.includes(ext)) {
|
|
23
23
|
extensions = [...extensions, ...ext];
|
|
24
24
|
}
|
|
@@ -27,25 +27,29 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost, getLangu
|
|
|
27
27
|
return readDirectory(path, extensions, exclude, include, depth);
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
-
if (
|
|
30
|
+
if (extensions.length) {
|
|
31
31
|
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(fileName));
|
|
32
|
+
const getCanonicalFileName = languageServiceHost.useCaseSensitiveFileNames?.()
|
|
33
|
+
? (fileName) => fileName
|
|
34
|
+
: (fileName) => fileName.toLowerCase();
|
|
35
|
+
const moduleResolutionCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), getCanonicalFileName, languageServiceHost.getCompilationSettings());
|
|
32
36
|
if (resolveModuleNameLiterals) {
|
|
33
37
|
languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, ...rest) => {
|
|
34
|
-
if (moduleLiterals.every(name => !
|
|
38
|
+
if (moduleLiterals.every(name => !extensions.some(ext => name.text.endsWith(ext)))) {
|
|
35
39
|
return resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, ...rest);
|
|
36
40
|
}
|
|
37
41
|
return moduleLiterals.map(moduleLiteral => {
|
|
38
|
-
return resolveModuleName(moduleLiteral.text, containingFile, options,
|
|
42
|
+
return resolveModuleName(moduleLiteral.text, containingFile, options, moduleResolutionCache, redirectedReference);
|
|
39
43
|
});
|
|
40
44
|
};
|
|
41
45
|
}
|
|
42
46
|
if (resolveModuleNames) {
|
|
43
47
|
languageServiceHost.resolveModuleNames = (moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile) => {
|
|
44
|
-
if (moduleNames.every(name => !
|
|
48
|
+
if (moduleNames.every(name => !extensions.some(ext => name.endsWith(ext)))) {
|
|
45
49
|
return resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile);
|
|
46
50
|
}
|
|
47
51
|
return moduleNames.map(moduleName => {
|
|
48
|
-
return resolveModuleName(moduleName, containingFile, options,
|
|
52
|
+
return resolveModuleName(moduleName, containingFile, options, moduleResolutionCache, redirectedReference).resolvedModule;
|
|
49
53
|
});
|
|
50
54
|
};
|
|
51
55
|
}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.proxyCreateProgram = void 0;
|
|
4
4
|
const decorateProgram_1 = require("./decorateProgram");
|
|
5
5
|
const language_core_1 = require("@volar/language-core");
|
|
6
|
+
const resolveModuleName_1 = require("../resolveModuleName");
|
|
6
7
|
function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
7
8
|
return new Proxy(original, {
|
|
8
9
|
apply: (target, thisArg, args) => {
|
|
@@ -15,8 +16,7 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
|
15
16
|
const sourceFileToSnapshotMap = new WeakMap();
|
|
16
17
|
const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
17
18
|
let snapshot;
|
|
18
|
-
|
|
19
|
-
const sourceFile = originalSourceFiles.get(fileName);
|
|
19
|
+
const sourceFile = originalHost.getSourceFile(fileName, 99);
|
|
20
20
|
if (sourceFile) {
|
|
21
21
|
snapshot = sourceFileToSnapshotMap.get(sourceFile);
|
|
22
22
|
if (!snapshot) {
|
|
@@ -41,26 +41,11 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
|
41
41
|
language.scripts.delete(fileName);
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
|
-
const originalSourceFiles = new Map();
|
|
45
44
|
const parsedSourceFiles = new WeakMap();
|
|
46
|
-
const arbitraryExtensions = extensions.map(ext => `.d${ext}.ts`);
|
|
47
45
|
const originalHost = options.host;
|
|
48
|
-
const moduleResolutionHost = {
|
|
49
|
-
...originalHost,
|
|
50
|
-
fileExists(fileName) {
|
|
51
|
-
for (let i = 0; i < arbitraryExtensions.length; i++) {
|
|
52
|
-
if (fileName.endsWith(arbitraryExtensions[i])) {
|
|
53
|
-
return originalHost.fileExists(fileName.slice(0, -arbitraryExtensions[i].length) + extensions[i]);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return originalHost.fileExists(fileName);
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
46
|
options.host = { ...originalHost };
|
|
60
|
-
options.options.allowArbitraryExtensions = true;
|
|
61
47
|
options.host.getSourceFile = (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => {
|
|
62
48
|
const originalSourceFile = originalHost.getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
|
|
63
|
-
originalSourceFiles.set(fileName, originalSourceFile);
|
|
64
49
|
if (originalSourceFile && extensions.some(ext => fileName.endsWith(ext))) {
|
|
65
50
|
let sourceFile2 = parsedSourceFiles.get(originalSourceFile);
|
|
66
51
|
if (!sourceFile2) {
|
|
@@ -69,14 +54,14 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
|
69
54
|
let patchedText = originalSourceFile.text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
|
|
70
55
|
let scriptKind = ts.ScriptKind.TS;
|
|
71
56
|
if (sourceScript.generated?.languagePlugin.typescript) {
|
|
72
|
-
const { getServiceScript
|
|
73
|
-
const serviceScript =
|
|
57
|
+
const { getServiceScript, getExtraServiceScripts } = sourceScript.generated.languagePlugin.typescript;
|
|
58
|
+
const serviceScript = getServiceScript(sourceScript.generated.root);
|
|
74
59
|
if (serviceScript) {
|
|
75
60
|
scriptKind = serviceScript.scriptKind;
|
|
76
61
|
patchedText += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
|
|
77
62
|
}
|
|
78
|
-
if (
|
|
79
|
-
console.warn('
|
|
63
|
+
if (getExtraServiceScripts) {
|
|
64
|
+
console.warn('getExtraServiceScripts() is not available in this use case.');
|
|
80
65
|
}
|
|
81
66
|
}
|
|
82
67
|
sourceFile2 = ts.createSourceFile(fileName, patchedText, 99, true, scriptKind);
|
|
@@ -88,34 +73,34 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
|
88
73
|
}
|
|
89
74
|
return originalSourceFile;
|
|
90
75
|
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
76
|
+
if (extensions.length) {
|
|
77
|
+
options.options.allowArbitraryExtensions = true;
|
|
78
|
+
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, originalHost, language.plugins, fileName => language.scripts.get(fileName));
|
|
79
|
+
const resolveModuleNameLiterals = originalHost.resolveModuleNameLiterals;
|
|
80
|
+
const resolveModuleNames = originalHost.resolveModuleNames;
|
|
81
|
+
const moduleResolutionCache = ts.createModuleResolutionCache(originalHost.getCurrentDirectory(), originalHost.getCanonicalFileName, options.options);
|
|
82
|
+
options.host.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, compilerOptions, ...rest) => {
|
|
83
|
+
if (resolveModuleNameLiterals && moduleLiterals.every(name => !extensions.some(ext => name.text.endsWith(ext)))) {
|
|
84
|
+
return resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, compilerOptions, ...rest);
|
|
85
|
+
}
|
|
86
|
+
return moduleLiterals.map(moduleLiteral => {
|
|
87
|
+
return resolveModuleName(moduleLiteral.text, containingFile, compilerOptions, moduleResolutionCache, redirectedReference);
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
options.host.resolveModuleNames = (moduleNames, containingFile, reusedNames, redirectedReference, compilerOptions, containingSourceFile) => {
|
|
91
|
+
if (resolveModuleNames && moduleNames.every(name => !extensions.some(ext => name.endsWith(ext)))) {
|
|
92
|
+
return resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, compilerOptions, containingSourceFile);
|
|
93
|
+
}
|
|
94
|
+
return moduleNames.map(moduleName => {
|
|
95
|
+
return resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionCache, redirectedReference).resolvedModule;
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const program = Reflect.apply(target, thisArg, args);
|
|
102
100
|
(0, decorateProgram_1.decorateProgram)(language, program);
|
|
103
101
|
// TODO: #128
|
|
104
102
|
program.__volar__ = { language };
|
|
105
103
|
return program;
|
|
106
|
-
function resolveModuleName(name, containingFile, options, redirectedReference) {
|
|
107
|
-
const resolved = ts.resolveModuleName(name, containingFile, options, moduleResolutionHost, originalHost.getModuleResolutionCache?.(), redirectedReference);
|
|
108
|
-
if (resolved.resolvedModule) {
|
|
109
|
-
for (let i = 0; i < arbitraryExtensions.length; i++) {
|
|
110
|
-
if (resolved.resolvedModule.resolvedFileName.endsWith(arbitraryExtensions[i])) {
|
|
111
|
-
const sourceFileName = resolved.resolvedModule.resolvedFileName.slice(0, -arbitraryExtensions[i].length) + extensions[i];
|
|
112
|
-
resolved.resolvedModule.resolvedFileName = sourceFileName;
|
|
113
|
-
resolved.resolvedModule.extension = extensions[i];
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return resolved;
|
|
118
|
-
}
|
|
119
104
|
},
|
|
120
105
|
});
|
|
121
106
|
}
|
|
@@ -43,7 +43,7 @@ function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
|
|
|
43
43
|
}
|
|
44
44
|
if (languagePlugins.some(language => language.typescript?.extraFileExtensions.length)) {
|
|
45
45
|
// TODO: can this share between monorepo packages?
|
|
46
|
-
const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
|
|
46
|
+
const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames?.() ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
|
|
47
47
|
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, languagePlugins, fileName => language.scripts.get(projectHost.fileNameToScriptId(fileName)));
|
|
48
48
|
let lastSysVersion = projectHost.getSystemVersion?.();
|
|
49
49
|
languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, sourceFile) => {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { LanguagePlugin, SourceScript } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function createResolveModuleName(ts: typeof import('typescript'),
|
|
3
|
+
export declare function createResolveModuleName(ts: typeof import('typescript'), host: ts.ModuleResolutionHost, languagePlugins: LanguagePlugin<any>[], getSourceScript: (fileName: string) => SourceScript | undefined): (moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions, cache?: ts.ModuleResolutionCache, redirectedReference?: ts.ResolvedProjectReference, resolutionMode?: ts.ResolutionMode) => ts.ResolvedModuleWithFailedLookupLocations;
|
package/lib/resolveModuleName.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createResolveModuleName = void 0;
|
|
4
|
-
function createResolveModuleName(ts,
|
|
4
|
+
function createResolveModuleName(ts, host, languagePlugins, getSourceScript) {
|
|
5
5
|
const toPatchResults = new Map();
|
|
6
6
|
const moduleResolutionHost = {
|
|
7
|
-
readFile:
|
|
8
|
-
directoryExists:
|
|
9
|
-
realpath:
|
|
10
|
-
getCurrentDirectory:
|
|
11
|
-
getDirectories:
|
|
12
|
-
useCaseSensitiveFileNames:
|
|
7
|
+
readFile: host.readFile.bind(host),
|
|
8
|
+
directoryExists: host.directoryExists?.bind(host),
|
|
9
|
+
realpath: host.realpath?.bind(host),
|
|
10
|
+
getCurrentDirectory: host.getCurrentDirectory?.bind(host),
|
|
11
|
+
getDirectories: host.getDirectories?.bind(host),
|
|
12
|
+
useCaseSensitiveFileNames: typeof host.useCaseSensitiveFileNames === 'function'
|
|
13
|
+
? host.useCaseSensitiveFileNames.bind(host)
|
|
14
|
+
: host.useCaseSensitiveFileNames,
|
|
13
15
|
fileExists(fileName) {
|
|
14
16
|
for (const { typescript } of languagePlugins) {
|
|
15
17
|
if (!typescript) {
|
|
@@ -25,7 +27,7 @@ function createResolveModuleName(ts, languageServiceHost, languagePlugins, getSo
|
|
|
25
27
|
}
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
|
-
return
|
|
30
|
+
return host.fileExists(fileName);
|
|
29
31
|
},
|
|
30
32
|
};
|
|
31
33
|
return (moduleName, containingFile, compilerOptions, cache, redirectedReference, resolutionMode) => {
|
|
@@ -45,8 +47,8 @@ function createResolveModuleName(ts, languageServiceHost, languagePlugins, getSo
|
|
|
45
47
|
};
|
|
46
48
|
// fix https://github.com/vuejs/language-tools/issues/3332
|
|
47
49
|
function fileExists(fileName) {
|
|
48
|
-
if (
|
|
49
|
-
const fileSize = ts.sys.getFileSize?.(fileName) ??
|
|
50
|
+
if (host.fileExists(fileName)) {
|
|
51
|
+
const fileSize = ts.sys.getFileSize?.(fileName) ?? host.readFile(fileName)?.length ?? 0;
|
|
50
52
|
return fileSize < 4 * 1024 * 1024;
|
|
51
53
|
}
|
|
52
54
|
return false;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.2.0-alpha.
|
|
3
|
+
"version": "2.2.0-alpha.4",
|
|
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.2.0-alpha.
|
|
15
|
+
"@volar/language-core": "2.2.0-alpha.4",
|
|
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.2.0-alpha.
|
|
21
|
+
"@volar/language-service": "2.2.0-alpha.4"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "bd85b9c56d71c411fa3342696014c4b5f7436568"
|
|
24
24
|
}
|