astro-ghostcms/.pnpm-store/v3/files/c4/3b2fdbab2e0a168dc29242f5cc1...

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