178 lines
8.1 KiB
Plaintext
178 lines
8.1 KiB
Plaintext
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getExternalFiles = exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
|
|
const language_core_1 = require("@volar/language-core");
|
|
function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts, exts) {
|
|
let extraProjectVersion = 0;
|
|
const scripts = new Map();
|
|
const readDirectory = languageServiceHost.readDirectory?.bind(languageServiceHost);
|
|
const resolveModuleNameLiterals = languageServiceHost.resolveModuleNameLiterals?.bind(languageServiceHost);
|
|
const resolveModuleNames = languageServiceHost.resolveModuleNames?.bind(languageServiceHost);
|
|
const getProjectVersion = languageServiceHost.getProjectVersion?.bind(languageServiceHost);
|
|
const getScriptSnapshot = languageServiceHost.getScriptSnapshot.bind(languageServiceHost);
|
|
const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
|
|
// path completion
|
|
if (readDirectory) {
|
|
languageServiceHost.readDirectory = (path, extensions, exclude, include, depth) => {
|
|
if (extensions) {
|
|
for (const ext of exts) {
|
|
if (!extensions.includes(ext)) {
|
|
extensions = [...extensions, ...ext];
|
|
}
|
|
}
|
|
}
|
|
return readDirectory(path, extensions, exclude, include, depth);
|
|
};
|
|
}
|
|
if (resolveModuleNameLiterals) {
|
|
languageServiceHost.resolveModuleNameLiterals = (moduleNames, containingFile, redirectedReference, options, ...rest) => {
|
|
const resolvedModules = resolveModuleNameLiterals(moduleNames, containingFile, redirectedReference, options, ...rest);
|
|
return moduleNames.map((name, i) => {
|
|
if (exts.some(ext => name.text.endsWith(ext))) {
|
|
const resolved = resolveModuleName(name.text, containingFile, options, redirectedReference);
|
|
if (resolved.resolvedModule) {
|
|
return resolved;
|
|
}
|
|
}
|
|
return resolvedModules[i];
|
|
});
|
|
};
|
|
}
|
|
else if (resolveModuleNames) {
|
|
languageServiceHost.resolveModuleNames = (moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile) => {
|
|
const resolvedModules = resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, options, containingSourceFile);
|
|
return moduleNames.map((name, i) => {
|
|
if (exts.some(ext => name.endsWith(ext))) {
|
|
const resolved = resolveModuleName(name, containingFile, options, redirectedReference);
|
|
if (resolved.resolvedModule) {
|
|
return resolved.resolvedModule;
|
|
}
|
|
}
|
|
return resolvedModules[i];
|
|
});
|
|
};
|
|
}
|
|
if (getProjectVersion) {
|
|
languageServiceHost.getProjectVersion = () => {
|
|
return getProjectVersion() + ':' + extraProjectVersion;
|
|
};
|
|
}
|
|
languageServiceHost.getScriptSnapshot = (fileName) => {
|
|
if (exts.some(ext => fileName.endsWith(ext))) {
|
|
updateScript(fileName);
|
|
return scripts.get(fileName)?.snapshot;
|
|
}
|
|
return getScriptSnapshot(fileName);
|
|
};
|
|
if (getScriptKind) {
|
|
languageServiceHost.getScriptKind = (fileName) => {
|
|
if (exts.some(ext => fileName.endsWith(ext))) {
|
|
updateScript(fileName);
|
|
const script = scripts.get(fileName);
|
|
if (script) {
|
|
if (script.extension.endsWith('.js')) {
|
|
return ts.ScriptKind.JS;
|
|
}
|
|
if (script.extension.endsWith('.jsx')) {
|
|
return ts.ScriptKind.JSX;
|
|
}
|
|
if (script.extension.endsWith('.ts')) {
|
|
return ts.ScriptKind.TS;
|
|
}
|
|
if (script.extension.endsWith('.tsx')) {
|
|
return ts.ScriptKind.TSX;
|
|
}
|
|
}
|
|
return ts.ScriptKind.Deferred;
|
|
}
|
|
return getScriptKind(fileName);
|
|
};
|
|
}
|
|
function resolveModuleName(name, containingFile, options, redirectedReference) {
|
|
const resolved = ts.resolveModuleName(name, containingFile, options, {
|
|
readFile(fileName) {
|
|
return languageServiceHost.readFile(fileName);
|
|
},
|
|
fileExists(fileName) {
|
|
if (exts.some(ext => fileName.endsWith(ext + '.d.ts'))) {
|
|
return fileExists(fileName.slice(0, -'.d.ts'.length));
|
|
}
|
|
return languageServiceHost.fileExists(fileName);
|
|
},
|
|
}, undefined, redirectedReference);
|
|
if (resolved.resolvedModule) {
|
|
resolved.resolvedModule.resolvedFileName = resolved.resolvedModule.resolvedFileName.slice(0, -'.d.ts'.length);
|
|
const script = updateScript(resolved.resolvedModule.resolvedFileName);
|
|
if (script) {
|
|
resolved.resolvedModule.extension = script.extension;
|
|
}
|
|
}
|
|
return resolved;
|
|
}
|
|
// fix https://github.com/vuejs/language-tools/issues/3332
|
|
function fileExists(fileName) {
|
|
if (languageServiceHost.fileExists(fileName)) {
|
|
const fileSize = ts.sys.getFileSize?.(fileName) ?? languageServiceHost.readFile(fileName)?.length ?? 0;
|
|
return fileSize < 4 * 1024 * 1024;
|
|
}
|
|
return false;
|
|
}
|
|
function updateScript(fileName) {
|
|
const version = languageServiceHost.getScriptVersion(fileName);
|
|
if (version !== scripts.get(fileName)?.version) {
|
|
const text = languageServiceHost.readFile(fileName);
|
|
let snapshot;
|
|
let extension = '.ts';
|
|
if (text !== undefined) {
|
|
extraProjectVersion++;
|
|
const virtualFile = virtualFiles.updateSource(fileName, ts.ScriptSnapshot.fromString(text), undefined);
|
|
if (virtualFile) {
|
|
let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
|
|
(0, language_core_1.forEachEmbeddedFile)(virtualFile, file => {
|
|
const ext = file.fileName.substring(fileName.length);
|
|
if (file.kind === language_core_1.FileKind.TypeScriptHostFile && (ext === '.d.ts' || ext.match(/^\.(js|ts)x?$/))) {
|
|
extension = ext;
|
|
patchedText += file.snapshot.getText(0, file.snapshot.getLength());
|
|
}
|
|
});
|
|
snapshot = ts.ScriptSnapshot.fromString(patchedText);
|
|
}
|
|
}
|
|
else if (virtualFiles.hasSource(fileName)) {
|
|
extraProjectVersion++;
|
|
virtualFiles.deleteSource(fileName);
|
|
}
|
|
scripts.set(fileName, {
|
|
version,
|
|
snapshot,
|
|
extension,
|
|
});
|
|
}
|
|
return scripts.get(fileName);
|
|
}
|
|
}
|
|
exports.decorateLanguageServiceHost = decorateLanguageServiceHost;
|
|
function searchExternalFiles(ts, project, exts) {
|
|
if (project.projectKind !== ts.server.ProjectKind.Configured) {
|
|
return [];
|
|
}
|
|
const configFile = project.getProjectName();
|
|
const config = ts.readJsonConfigFile(configFile, project.readFile.bind(project));
|
|
const parseHost = {
|
|
useCaseSensitiveFileNames: project.useCaseSensitiveFileNames(),
|
|
fileExists: project.fileExists.bind(project),
|
|
readFile: project.readFile.bind(project),
|
|
readDirectory: (...args) => {
|
|
args[1] = exts;
|
|
return project.readDirectory(...args);
|
|
},
|
|
};
|
|
const parsed = ts.parseJsonSourceFileConfigFileContent(config, parseHost, project.getCurrentDirectory());
|
|
return parsed.fileNames;
|
|
}
|
|
exports.searchExternalFiles = searchExternalFiles;
|
|
/**
|
|
* @deprecated use `searchExternalFiles` instead
|
|
*/
|
|
exports.getExternalFiles = searchExternalFiles;
|
|
//# sourceMappingURL=serverPlugin.js.map |