138 lines
6.2 KiB
Plaintext
138 lines
6.2 KiB
Plaintext
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.register = void 0;
|
|
const language_core_1 = require("@volar/language-core");
|
|
const protocol_1 = require("../../../protocol");
|
|
function register(connection, workspaces, env) {
|
|
const scriptVersions = new Map();
|
|
const scriptVersionSnapshots = new WeakSet();
|
|
connection.onRequest(protocol_1.GetMatchTsConfigRequest.type, async (params) => {
|
|
const project = (await workspaces.getProject(params.uri));
|
|
if (project?.tsconfig) {
|
|
return { uri: env.fileNameToUri(project.tsconfig) };
|
|
}
|
|
});
|
|
connection.onRequest(protocol_1.GetVirtualFilesRequest.type, async (document) => {
|
|
const project = await workspaces.getProject(document.uri);
|
|
if (project) {
|
|
const file = project.project?.getLanguageService()?.context.virtualFiles.getSource(env.uriToFileName(document.uri))?.root;
|
|
return file ? prune(file) : undefined;
|
|
function prune(file) {
|
|
let version = scriptVersions.get(file.fileName) ?? 0;
|
|
if (!scriptVersionSnapshots.has(file.snapshot)) {
|
|
version++;
|
|
scriptVersions.set(file.fileName, version);
|
|
scriptVersionSnapshots.add(file.snapshot);
|
|
}
|
|
return {
|
|
fileName: file.fileName,
|
|
kind: file.kind,
|
|
capabilities: file.capabilities,
|
|
embeddedFiles: file.embeddedFiles.map(prune),
|
|
version,
|
|
};
|
|
}
|
|
}
|
|
});
|
|
connection.onRequest(protocol_1.GetVirtualFileRequest.type, async (params) => {
|
|
const project = await workspaces.getProject(params.sourceFileUri);
|
|
const service = project?.project?.getLanguageService();
|
|
if (service) {
|
|
let content = '';
|
|
let codegenStacks = [];
|
|
const mappings = {};
|
|
for (const [file, map] of service.context.documents.getMapsByVirtualFileName(params.virtualFileName)) {
|
|
content = map.virtualFileDocument.getText();
|
|
codegenStacks = file.codegenStacks;
|
|
mappings[map.sourceFileDocument.uri] = map.map.mappings;
|
|
}
|
|
return {
|
|
content,
|
|
mappings,
|
|
codegenStacks,
|
|
};
|
|
}
|
|
});
|
|
connection.onNotification(protocol_1.ReloadProjectNotification.type, () => {
|
|
workspaces.reloadProjects();
|
|
});
|
|
connection.onNotification(protocol_1.WriteVirtualFilesNotification.type, async (params) => {
|
|
const fsModeName = 'fs'; // avoid bundle
|
|
const fs = await import(fsModeName);
|
|
const project = await workspaces.getProject(params.uri);
|
|
if (project) {
|
|
const ls = (await project.project)?.getLanguageServiceDontCreate();
|
|
if (ls) {
|
|
const rootPath = ls.context.env.uriToFileName(ls.context.env.rootUri.toString());
|
|
for (const { root } of ls.context.virtualFiles.allSources()) {
|
|
(0, language_core_1.forEachEmbeddedFile)(root, virtualFile => {
|
|
if (virtualFile.kind === language_core_1.FileKind.TypeScriptHostFile) {
|
|
if (virtualFile.fileName.startsWith(rootPath)) {
|
|
const snapshot = virtualFile.snapshot;
|
|
fs.writeFile(virtualFile.fileName, snapshot.getText(0, snapshot.getLength()), () => { });
|
|
}
|
|
}
|
|
});
|
|
}
|
|
// global virtual files
|
|
for (const fileName of ls.context.host.getScriptFileNames()) {
|
|
if (!fs.existsSync(fileName)) {
|
|
const snapshot = ls.context.host.getScriptSnapshot(fileName);
|
|
if (snapshot) {
|
|
fs.writeFile(fileName, snapshot.getText(0, snapshot.getLength()), () => { });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
connection.onRequest(protocol_1.LoadedTSFilesMetaRequest.type, async () => {
|
|
const sourceFilesData = new Map();
|
|
for (const _project of [...workspaces.configProjects.values(), ...workspaces.inferredProjects.values()]) {
|
|
const project = await _project;
|
|
const service = project.getLanguageServiceDontCreate();
|
|
const languageService = service?.context.inject('typescript/languageService');
|
|
const program = languageService?.getProgram();
|
|
if (program) {
|
|
const projectName = typeof project.tsConfig === 'string' ? project.tsConfig : (project.languageHost.workspacePath + '(inferred)');
|
|
const sourceFiles = program?.getSourceFiles() ?? [];
|
|
for (const sourceFile of sourceFiles) {
|
|
if (!sourceFilesData.has(sourceFile)) {
|
|
let nodes = 0;
|
|
sourceFile.forEachChild(function walk(node) {
|
|
nodes++;
|
|
node.forEachChild(walk);
|
|
});
|
|
sourceFilesData.set(sourceFile, {
|
|
projectNames: [],
|
|
size: nodes * 128,
|
|
});
|
|
}
|
|
sourceFilesData.get(sourceFile).projectNames.push(projectName);
|
|
}
|
|
;
|
|
}
|
|
}
|
|
const result = {
|
|
inputs: {},
|
|
outputs: {},
|
|
};
|
|
for (const [sourceFile, fileData] of sourceFilesData) {
|
|
let key = fileData.projectNames.sort().join(', ');
|
|
if (fileData.projectNames.length >= 2) {
|
|
key = `Shared in ${fileData.projectNames.length} projects (${key})`;
|
|
}
|
|
result.outputs[key] ??= {
|
|
imports: [],
|
|
exports: [],
|
|
entryPoint: '',
|
|
inputs: {},
|
|
bytes: 0,
|
|
};
|
|
result.outputs[key].inputs[sourceFile.fileName] = { bytesInOutput: fileData.size };
|
|
}
|
|
return result;
|
|
});
|
|
}
|
|
exports.register = register;
|
|
//# sourceMappingURL=customFeatures.js.map |