@ui5/task-adaptation
Version:
Custom task for ui5-builder which allows building UI5 Flexibility Adaptation Projects for SAP BTP, Cloud Foundry environment
65 lines • 2.29 kB
JavaScript
import * as fs from "fs";
import * as path from "path";
import ResourceUtil from "../util/resourceUtil.js";
import tempFolder from "temp-dir";
export default class CacheManager {
configuration;
constructor(configuration) {
this.configuration = configuration;
}
getTempFolder() {
return path.join(tempFolder, this.getTempId());
}
async getFiles(fetchMetadata, fetchFiles) {
const tempMetadata = this.readTempMetadata();
const metadata = await fetchMetadata();
if (this.isMetadataSame(tempMetadata, metadata)) {
return this.readTemp();
}
else {
const files = await fetchFiles();
if (files?.size > 0) {
await this.writeTemp(files, metadata);
}
return files;
}
}
isMetadataSame(tempMetadata, metadata) {
// TODO: Implement correct metadata comparision.
return tempMetadata && metadata && tempMetadata.changedOn === metadata.changedOn;
}
readTempMetadata() {
const tempFolder = this.getTempFolder();
const filename = this.getMetadataFilename();
const metadataPath = path.resolve(tempFolder, filename);
if (fs.existsSync(metadataPath)) {
return JSON.parse(fs.readFileSync(metadataPath, { encoding: "utf-8" }));
}
}
writeTemp(files, metadata) {
this.deleteTemp();
const filesToCache = this.getFilesToCache(files, metadata);
return ResourceUtil.write(this.getTempFolder(), filesToCache);
}
async readTemp() {
const files = new Map();
const tempFolder = this.getTempFolder();
if (fs.existsSync(tempFolder)) {
ResourceUtil.read(tempFolder, tempFolder, files, [this.getMetadataFilename()]);
}
return files;
}
deleteTemp() {
fs.rmSync(this.getTempFolder(), { recursive: true, force: true });
}
normalizeId(id) {
return id.replace(/\/\\/g, "_");
}
getFilesToCache(files, metadata) {
const filename = this.getMetadataFilename();
const filesClone = new Map([...files]);
filesClone.set(filename, JSON.stringify(metadata));
return filesClone;
}
}
//# sourceMappingURL=cacheManager.js.map