@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>
69 lines (68 loc) • 2.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProgramStorage = void 0;
const tslib_1 = require("tslib");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const ts_morph_1 = require("./ts-morph");
//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 ??
Promise.resolve((0, ts_morph_1.createProject)(typescript_1.default, {
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;