@volar/typescript 2.2.0-alpha.0 → 2.2.0-alpha.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.
- package/lib/documentRegistry.d.ts +2 -0
- package/lib/documentRegistry.js +14 -0
- package/lib/node/decorateLanguageService.js +216 -139
- package/lib/node/decorateLanguageServiceHost.d.ts +2 -2
- package/lib/node/decorateLanguageServiceHost.js +55 -60
- package/lib/node/decorateProgram.js +14 -5
- package/lib/node/dedupe.d.ts +0 -1
- package/lib/node/dedupe.js +1 -9
- package/lib/node/proxyCreateProgram.d.ts +2 -2
- package/lib/node/proxyCreateProgram.js +138 -94
- package/lib/node/transform.d.ts +11 -6
- package/lib/node/transform.js +83 -47
- package/lib/protocol/createProject.js +1 -1
- package/lib/quickstart/createAsyncLanguageServicePlugin.d.ts +1 -1
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +3 -3
- package/lib/quickstart/createLanguageServicePlugin.d.ts +1 -1
- package/lib/quickstart/createLanguageServicePlugin.js +3 -3
- package/lib/quickstart/runTsc.d.ts +2 -1
- package/lib/quickstart/runTsc.js +11 -6
- package/lib/resolveModuleName.d.ts +1 -1
- package/lib/resolveModuleName.js +41 -24
- package/package.json +4 -4
package/lib/node/transform.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
3
|
+
exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const utils_1 = require("./utils");
|
|
6
6
|
const transformedDiagnostics = new WeakMap();
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
7
|
+
const transformedSourceFile = new WeakSet();
|
|
8
|
+
function transformCallHierarchyItem(language, item, filter) {
|
|
9
|
+
const span = transformSpan(language, item.file, item.span, filter);
|
|
10
|
+
const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
|
|
10
11
|
return {
|
|
11
12
|
...item,
|
|
12
13
|
span: span?.textSpan ?? { start: 0, length: 0 },
|
|
@@ -14,26 +15,29 @@ function transformCallHierarchyItem(files, item, filter) {
|
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
17
|
exports.transformCallHierarchyItem = transformCallHierarchyItem;
|
|
17
|
-
function transformDiagnostic(
|
|
18
|
+
function transformDiagnostic(language, diagnostic, isTsc) {
|
|
18
19
|
if (!transformedDiagnostics.has(diagnostic)) {
|
|
19
20
|
transformedDiagnostics.set(diagnostic, undefined);
|
|
20
21
|
const { relatedInformation } = diagnostic;
|
|
21
22
|
if (relatedInformation) {
|
|
22
23
|
diagnostic.relatedInformation = relatedInformation
|
|
23
|
-
.map(d => transformDiagnostic(
|
|
24
|
+
.map(d => transformDiagnostic(language, d, isTsc))
|
|
24
25
|
.filter(utils_1.notEmpty);
|
|
25
26
|
}
|
|
26
27
|
if (diagnostic.file !== undefined
|
|
27
28
|
&& diagnostic.start !== undefined
|
|
28
29
|
&& diagnostic.length !== undefined) {
|
|
29
|
-
const [
|
|
30
|
-
if (
|
|
31
|
-
const
|
|
32
|
-
if (
|
|
30
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
|
|
31
|
+
if (serviceScript) {
|
|
32
|
+
const sourceSpan = transformTextSpan(sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
|
|
33
|
+
if (sourceSpan) {
|
|
34
|
+
if (isTsc) {
|
|
35
|
+
fillSourceFileText(language, diagnostic.file);
|
|
36
|
+
}
|
|
33
37
|
transformedDiagnostics.set(diagnostic, {
|
|
34
38
|
...diagnostic,
|
|
35
|
-
start:
|
|
36
|
-
length:
|
|
39
|
+
start: sourceSpan.start,
|
|
40
|
+
length: sourceSpan.length,
|
|
37
41
|
});
|
|
38
42
|
}
|
|
39
43
|
}
|
|
@@ -48,13 +52,26 @@ function transformDiagnostic(files, diagnostic) {
|
|
|
48
52
|
return transformedDiagnostics.get(diagnostic);
|
|
49
53
|
}
|
|
50
54
|
exports.transformDiagnostic = transformDiagnostic;
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
// fix https://github.com/vuejs/language-tools/issues/4099 without `incremental`
|
|
56
|
+
function fillSourceFileText(language, sourceFile) {
|
|
57
|
+
if (transformedSourceFile.has(sourceFile)) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
transformedSourceFile.add(sourceFile);
|
|
61
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
62
|
+
if (serviceScript) {
|
|
63
|
+
sourceFile.text = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())
|
|
64
|
+
+ sourceFile.text.substring(sourceScript.snapshot.getLength());
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.fillSourceFileText = fillSourceFileText;
|
|
68
|
+
function transformFileTextChanges(language, changes, filter) {
|
|
69
|
+
const [_, source] = (0, utils_1.getServiceScript)(language, changes.fileName);
|
|
53
70
|
if (source) {
|
|
54
71
|
return {
|
|
55
72
|
...changes,
|
|
56
73
|
textChanges: changes.textChanges.map(c => {
|
|
57
|
-
const span = transformSpan(
|
|
74
|
+
const span = transformSpan(language, changes.fileName, c.span, filter);
|
|
58
75
|
if (span) {
|
|
59
76
|
return {
|
|
60
77
|
...c,
|
|
@@ -69,23 +86,20 @@ function transformFileTextChanges(files, changes, filter) {
|
|
|
69
86
|
}
|
|
70
87
|
}
|
|
71
88
|
exports.transformFileTextChanges = transformFileTextChanges;
|
|
72
|
-
function transformDocumentSpan(
|
|
73
|
-
let textSpan = transformSpan(
|
|
89
|
+
function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
|
|
90
|
+
let textSpan = transformSpan(language, documentSpan.fileName, documentSpan.textSpan, filter);
|
|
74
91
|
if (!textSpan && shouldFallback) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
textSpan
|
|
78
|
-
|
|
79
|
-
textSpan: { start: 0, length: 0 },
|
|
80
|
-
};
|
|
81
|
-
}
|
|
92
|
+
textSpan = {
|
|
93
|
+
fileName: documentSpan.fileName,
|
|
94
|
+
textSpan: { start: 0, length: 0 },
|
|
95
|
+
};
|
|
82
96
|
}
|
|
83
97
|
if (!textSpan) {
|
|
84
98
|
return;
|
|
85
99
|
}
|
|
86
|
-
const contextSpan = transformSpan(
|
|
87
|
-
const originalTextSpan = transformSpan(
|
|
88
|
-
const originalContextSpan = transformSpan(
|
|
100
|
+
const contextSpan = transformSpan(language, documentSpan.fileName, documentSpan.contextSpan, filter);
|
|
101
|
+
const originalTextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
|
|
102
|
+
const originalContextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
|
|
89
103
|
return {
|
|
90
104
|
...documentSpan,
|
|
91
105
|
fileName: textSpan.fileName,
|
|
@@ -97,23 +111,17 @@ function transformDocumentSpan(files, documentSpan, filter, shouldFallback) {
|
|
|
97
111
|
};
|
|
98
112
|
}
|
|
99
113
|
exports.transformDocumentSpan = transformDocumentSpan;
|
|
100
|
-
function transformSpan(
|
|
101
|
-
if (!fileName) {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
if (!textSpan) {
|
|
114
|
+
function transformSpan(language, fileName, textSpan, filter) {
|
|
115
|
+
if (!fileName || !textSpan) {
|
|
105
116
|
return;
|
|
106
117
|
}
|
|
107
|
-
const [virtualFile, sourceScript, map] = (0, utils_1.getServiceScript)(
|
|
118
|
+
const [virtualFile, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
108
119
|
if (virtualFile) {
|
|
109
|
-
const
|
|
110
|
-
if (
|
|
120
|
+
const sourceSpan = transformTextSpan(sourceScript, map, textSpan, filter);
|
|
121
|
+
if (sourceSpan) {
|
|
111
122
|
return {
|
|
112
123
|
fileName,
|
|
113
|
-
textSpan:
|
|
114
|
-
start: sourceRange[0],
|
|
115
|
-
length: sourceRange[1] - sourceRange[0],
|
|
116
|
-
},
|
|
124
|
+
textSpan: sourceSpan,
|
|
117
125
|
};
|
|
118
126
|
}
|
|
119
127
|
}
|
|
@@ -125,15 +133,43 @@ function transformSpan(files, fileName, textSpan, filter) {
|
|
|
125
133
|
}
|
|
126
134
|
}
|
|
127
135
|
exports.transformSpan = transformSpan;
|
|
128
|
-
function
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
+
function transformTextChange(sourceScript, map, textChange, filter) {
|
|
137
|
+
const sourceSpan = transformTextSpan(sourceScript, map, textChange.span, filter);
|
|
138
|
+
if (sourceSpan) {
|
|
139
|
+
return {
|
|
140
|
+
newText: textChange.newText,
|
|
141
|
+
span: sourceSpan,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.transformTextChange = transformTextChange;
|
|
146
|
+
function transformTextSpan(sourceScript, map, textSpan, filter) {
|
|
147
|
+
const start = textSpan.start;
|
|
148
|
+
const end = textSpan.start + textSpan.length;
|
|
149
|
+
const sourceStart = toSourceOffset(sourceScript, map, start, filter);
|
|
150
|
+
const sourceEnd = toSourceOffset(sourceScript, map, end, filter);
|
|
151
|
+
if (sourceStart !== undefined && sourceEnd !== undefined && sourceEnd >= sourceStart) {
|
|
152
|
+
return {
|
|
153
|
+
start: sourceStart,
|
|
154
|
+
length: sourceEnd - sourceStart,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
exports.transformTextSpan = transformTextSpan;
|
|
159
|
+
function toSourceOffset(sourceScript, map, position, filter) {
|
|
160
|
+
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - sourceScript.snapshot.getLength())) {
|
|
161
|
+
if (filter(mapping.data)) {
|
|
162
|
+
return sourceOffset;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.toSourceOffset = toSourceOffset;
|
|
167
|
+
function toGeneratedOffset(sourceScript, map, position, filter) {
|
|
168
|
+
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
169
|
+
if (filter(mapping.data)) {
|
|
170
|
+
return generateOffset + sourceScript.snapshot.getLength();
|
|
136
171
|
}
|
|
137
172
|
}
|
|
138
173
|
}
|
|
174
|
+
exports.toGeneratedOffset = toGeneratedOffset;
|
|
139
175
|
//# sourceMappingURL=transform.js.map
|
|
@@ -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 * as ts from 'typescript';
|
|
2
2
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin[]
|
|
3
|
+
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin[]>, getLanguageId: (fileName: string) => string): ts.server.PluginModuleFactory;
|
|
@@ -8,7 +8,7 @@ const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
|
|
|
8
8
|
const externalFiles = new WeakMap();
|
|
9
9
|
const decoratedLanguageServices = new WeakSet();
|
|
10
10
|
const decoratedLanguageServiceHosts = new WeakSet();
|
|
11
|
-
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins) {
|
|
11
|
+
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins, getLanguageId) {
|
|
12
12
|
return modules => {
|
|
13
13
|
const { typescript: ts } = modules;
|
|
14
14
|
const pluginModule = {
|
|
@@ -55,14 +55,14 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
55
55
|
const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
56
56
|
const snapshot = getScriptSnapshot(fileName);
|
|
57
57
|
if (snapshot) {
|
|
58
|
-
language.scripts.set(fileName, (
|
|
58
|
+
language.scripts.set(fileName, getLanguageId(fileName), snapshot);
|
|
59
59
|
}
|
|
60
60
|
else {
|
|
61
61
|
language.scripts.delete(fileName);
|
|
62
62
|
}
|
|
63
63
|
});
|
|
64
64
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
65
|
-
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(language, info.languageServiceHost
|
|
65
|
+
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
66
66
|
info.project.markAsDirty();
|
|
67
67
|
initialized = true;
|
|
68
68
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[]): ts.server.PluginModuleFactory;
|
|
3
|
+
export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[], getLanguageId: (fileName: string) => string): ts.server.PluginModuleFactory;
|
|
4
4
|
export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
|
|
@@ -8,7 +8,7 @@ const externalFiles = new WeakMap();
|
|
|
8
8
|
const projectExternalFileExtensions = new WeakMap();
|
|
9
9
|
const decoratedLanguageServices = new WeakSet();
|
|
10
10
|
const decoratedLanguageServiceHosts = new WeakSet();
|
|
11
|
-
function createLanguageServicePlugin(loadLanguagePlugins) {
|
|
11
|
+
function createLanguageServicePlugin(loadLanguagePlugins, getLanguageId) {
|
|
12
12
|
return modules => {
|
|
13
13
|
const { typescript: ts } = modules;
|
|
14
14
|
const pluginModule = {
|
|
@@ -26,14 +26,14 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
|
|
|
26
26
|
const language = (0, language_core_1.createLanguage)(languagePlugins, ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
27
27
|
const snapshot = getScriptSnapshot(fileName);
|
|
28
28
|
if (snapshot) {
|
|
29
|
-
language.scripts.set(fileName, (
|
|
29
|
+
language.scripts.set(fileName, getLanguageId(fileName), snapshot);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
32
|
language.scripts.delete(fileName);
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
35
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
36
|
-
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(language, info.languageServiceHost
|
|
36
|
+
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
37
37
|
}
|
|
38
38
|
return info.languageService;
|
|
39
39
|
},
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import type { LanguagePlugin } from '@volar/language-core';
|
|
3
3
|
export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[];
|
|
4
|
-
export declare
|
|
4
|
+
export declare let getLanguageId: (fileName: string) => string;
|
|
5
|
+
export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins, _getLanguageId: typeof getLanguageId): void;
|
package/lib/quickstart/runTsc.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runTsc = exports.getLanguagePlugins = void 0;
|
|
3
|
+
exports.runTsc = exports.getLanguageId = exports.getLanguagePlugins = void 0;
|
|
4
4
|
const fs = require("fs");
|
|
5
5
|
let getLanguagePlugins = () => [];
|
|
6
6
|
exports.getLanguagePlugins = getLanguagePlugins;
|
|
7
|
-
|
|
7
|
+
let getLanguageId = () => 'ts';
|
|
8
|
+
exports.getLanguageId = getLanguageId;
|
|
9
|
+
function runTsc(tscPath, extensions, _getLanguagePlugins, _getLanguageId) {
|
|
8
10
|
exports.getLanguagePlugins = _getLanguagePlugins;
|
|
11
|
+
exports.getLanguageId = _getLanguageId;
|
|
9
12
|
const proxyApiPath = require.resolve('../node/proxyCreateProgram');
|
|
10
13
|
const readFileSync = fs.readFileSync;
|
|
11
14
|
fs.readFileSync = (...args) => {
|
|
@@ -18,10 +21,12 @@ function runTsc(tscPath, extensions, _getLanguagePlugins) {
|
|
|
18
21
|
tsc = replace(tsc, /allSupportedExtensions = .*(?=;)/, s => s + `.concat([[${extsText}]])`);
|
|
19
22
|
// proxy createProgram
|
|
20
23
|
tsc = replace(tsc, /function createProgram\(.+\) {/, s => `var createProgram = require(${JSON.stringify(proxyApiPath)}).proxyCreateProgram(`
|
|
21
|
-
+
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
+ [
|
|
25
|
+
`new Proxy({}, { get(_target, p, _receiver) { return eval(p); } } )`,
|
|
26
|
+
`_createProgram`,
|
|
27
|
+
`require(${JSON.stringify(__filename)}).getLanguagePlugins`,
|
|
28
|
+
`require(${JSON.stringify(__filename)}).getLanguageId`,
|
|
29
|
+
].join(', ')
|
|
25
30
|
+ `);\n`
|
|
26
31
|
+ s.replace('createProgram', '_createProgram'));
|
|
27
32
|
return tsc;
|
|
@@ -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,
|
|
5
|
-
const
|
|
4
|
+
function createResolveModuleName(ts, host, languagePlugins, getSourceScript) {
|
|
5
|
+
const toSourceFileInfo = 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) {
|
|
@@ -17,36 +19,51 @@ function createResolveModuleName(ts, languageServiceHost, languagePlugins, getSo
|
|
|
17
19
|
}
|
|
18
20
|
for (const { extension } of typescript.extraFileExtensions) {
|
|
19
21
|
if (fileName.endsWith(`.d.${extension}.ts`)) {
|
|
20
|
-
const
|
|
21
|
-
if (fileExists(
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const sourceFileName = fileName.slice(0, -`.d.${extension}.ts`.length) + `.${extension}`;
|
|
23
|
+
if (fileExists(sourceFileName)) {
|
|
24
|
+
const sourceScript = getSourceScript(sourceFileName);
|
|
25
|
+
if (sourceScript?.generated) {
|
|
26
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
27
|
+
if (serviceScript) {
|
|
28
|
+
const dtsPath = sourceFileName + '.d.ts';
|
|
29
|
+
if ((serviceScript.extension === '.js' || serviceScript.extension === '.jsx') && fileExists(dtsPath)) {
|
|
30
|
+
toSourceFileInfo.set(fileName, {
|
|
31
|
+
sourceFileName: dtsPath,
|
|
32
|
+
extension: '.ts',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
toSourceFileInfo.set(fileName, {
|
|
37
|
+
sourceFileName,
|
|
38
|
+
extension: serviceScript.extension,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
24
44
|
}
|
|
25
45
|
}
|
|
26
46
|
}
|
|
27
47
|
}
|
|
28
|
-
return
|
|
48
|
+
return host.fileExists(fileName);
|
|
29
49
|
},
|
|
30
50
|
};
|
|
31
51
|
return (moduleName, containingFile, compilerOptions, cache, redirectedReference, resolutionMode) => {
|
|
32
52
|
const result = ts.resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost, cache, redirectedReference, resolutionMode);
|
|
33
|
-
if (result.resolvedModule
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (serviceScript) {
|
|
39
|
-
result.resolvedModule.extension = serviceScript.extension;
|
|
40
|
-
}
|
|
53
|
+
if (result.resolvedModule) {
|
|
54
|
+
const sourceFileInfo = toSourceFileInfo.get(result.resolvedModule.resolvedFileName);
|
|
55
|
+
if (sourceFileInfo) {
|
|
56
|
+
result.resolvedModule.resolvedFileName = sourceFileInfo.sourceFileName;
|
|
57
|
+
result.resolvedModule.extension = sourceFileInfo.extension;
|
|
41
58
|
}
|
|
42
59
|
}
|
|
43
|
-
|
|
60
|
+
toSourceFileInfo.clear();
|
|
44
61
|
return result;
|
|
45
62
|
};
|
|
46
63
|
// fix https://github.com/vuejs/language-tools/issues/3332
|
|
47
64
|
function fileExists(fileName) {
|
|
48
|
-
if (
|
|
49
|
-
const fileSize = ts.sys.getFileSize?.(fileName) ??
|
|
65
|
+
if (host.fileExists(fileName)) {
|
|
66
|
+
const fileSize = ts.sys.getFileSize?.(fileName) ?? host.readFile(fileName)?.length ?? 0;
|
|
50
67
|
return fileSize < 4 * 1024 * 1024;
|
|
51
68
|
}
|
|
52
69
|
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.10",
|
|
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.10",
|
|
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.10"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "aedd2230883c457f703be93ed150917a3efde75c"
|
|
24
24
|
}
|