UNPKG

localbackup

Version:

Utility to make local backups easily and without the hassle.

107 lines 5.56 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __asyncValues = (this && this.__asyncValues) || function (o) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var m = o[Symbol.asyncIterator], i; return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.deleteOldBackups = void 0; const node_path_1 = __importDefault(require("node:path")); const ora_1 = __importDefault(require("ora")); const chalk_1 = __importDefault(require("chalk")); const dayjs_1 = __importDefault(require("dayjs")); const customParseFormat_1 = __importDefault(require("dayjs/plugin/customParseFormat")); const constants_1 = require("./constants"); const storageProviders_1 = require("./storageProviders"); dayjs_1.default.extend(customParseFormat_1.default); function deleteOldBackups(props) { var _a, e_1, _b, _c, _d, e_2, _e, _f; return __awaiter(this, void 0, void 0, function* () { // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (!props.keepLast) return; const keepLast = parseInt(props.keepLast, 10); if (keepLast < 1) return; const spinner = (0, ora_1.default)('Deleting old backups...').start(); // Get the storage provider const provider = storageProviders_1.storageProviders[props.storageProvider]; // Get all files in the target directory that match the prefix and file type const dirFileNames = yield provider.listFiles(props.targetDirectory); let matches = []; try { for (var _g = true, dirFileNames_1 = __asyncValues(dirFileNames), dirFileNames_1_1; dirFileNames_1_1 = yield dirFileNames_1.next(), _a = dirFileNames_1_1.done, !_a;) { _c = dirFileNames_1_1.value; _g = false; try { const filePath = _c; const fileName = node_path_1.default.basename(filePath); const isMatch = fileName.startsWith(props.prefix) && fileName.endsWith(props.fileType); if (isMatch) { matches.push(fileName); } } finally { _g = true; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (!_g && !_a && (_b = dirFileNames_1.return)) yield _b.call(dirFileNames_1); } finally { if (e_1) throw e_1.error; } } // Order the files by date matches = matches.sort((a, b) => { const dateStrA = a.replace(`${props.prefix}-`, '').replace(`.${props.fileType}`, ''); const dateStrB = b.replace(`${props.prefix}-`, '').replace(`.${props.fileType}`, ''); const dateA = (0, dayjs_1.default)(dateStrA, constants_1.DATE_FORMAT).toDate(); const dateB = (0, dayjs_1.default)(dateStrB, constants_1.DATE_FORMAT).toDate(); return dateA.getTime() - dateB.getTime(); }); // Get last N files and files to delete const lastN = matches.slice(keepLast * -1); const toDelete = matches.filter((fileName) => !lastN.includes(fileName)); try { // Delete files for (var _h = true, toDelete_1 = __asyncValues(toDelete), toDelete_1_1; toDelete_1_1 = yield toDelete_1.next(), _d = toDelete_1_1.done, !_d;) { _f = toDelete_1_1.value; _h = false; try { const fileName = _f; yield provider.deleteFile(node_path_1.default.join(props.targetDirectory, fileName)); } finally { _h = true; } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (!_h && !_d && (_e = toDelete_1.return)) yield _e.call(toDelete_1); } finally { if (e_2) throw e_2.error; } } spinner.stop(); console.log(chalk_1.default.gray(`✅ Old backups deleted (${toDelete.length})`)); }); } exports.deleteOldBackups = deleteOldBackups; //# sourceMappingURL=deleteOldBackups.js.map