@clawject/di
Version:
<p align="center"> <a href="https://clawject.com/" target="_blank"><img src="https://clawject.com/img/logo.svg" align="center" alt="Clawject Logo" width="120" height="120" /></a> </p>
65 lines (64 loc) • 2.21 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProgramStorage = void 0;
const createTSMorphProject_1 = require("./createTSMorphProject");
//TODO add tests for different version with unplugin
class ProgramStorage {
constructor(options) {
this.options = options;
this.fileNameToFileContent = new Map();
this.project = undefined;
this.program = undefined;
}
async updateFile(fileName, content) {
const project = await this.getProject();
this.fileNameToFileContent.set(fileName, content);
if (project.getSourceFile(fileName)) {
project.updateSourceFile(fileName, content);
}
else {
project.createSourceFile(fileName, content);
}
}
async deleteFile(fileName) {
const project = await this.getProject();
this.fileNameToFileContent.delete(fileName);
project.removeSourceFile(fileName);
}
getProject() {
this.project = this.project ?? (0, createTSMorphProject_1.createTSMorphProject)({
tsConfigFilePath: this.options.tsconfig,
skipAddingFilesFromTsConfig: true
});
return this.project;
}
async getProgram() {
return this.program ?? this.refreshProgram();
}
async refreshProgram() {
const oldProgram = this.program;
const needsUpdate = !oldProgram || this.checkIfProgramNeedsUpdate(oldProgram);
if (!needsUpdate) {
return oldProgram;
}
const project = await this.getProject();
project.resolveSourceFileDependencies();
this.program = project.createProgram();
return this.program;
}
checkIfProgramNeedsUpdate(oldProgram) {
let result = false;
for (const [fileName, content] of this.fileNameToFileContent) {
if (result) {
break;
}
const oldSourceFile = oldProgram.getSourceFile(fileName);
if (!oldSourceFile || oldSourceFile.text !== content) {
result = true;
break;
}
}
return result;
}
}
exports.ProgramStorage = ProgramStorage;