UNPKG

wip-backup-manager

Version:

This utility enables backup & restore of Kentico Kontent projects

257 lines 13.7 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 __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var fs = require("fs"); var https_1 = require("https"); var JSZip = require("jszip"); var ZipService = /** @class */ (function () { function ZipService(config) { this.config = config; this.zipExtension = '.zip'; this.contentTypesName = 'contentTypes.json'; this.contentItemsName = 'contentItems.json'; this.taxonomiesName = 'taxonomies.json'; this.assetsName = 'assets.json'; this.languageVariantsName = 'languageVariants.json'; this.contentTypeSnippetsName = 'contentTypesSnippets.json'; this.metadataName = 'metadata.json'; this.languages = 'languages.json'; this.filesName = 'files'; this.assetFoldersName = 'assetFolders.json'; this.validationName = 'validation.json'; this.filenameWithExtension = config.filename + this.zipExtension; } ZipService.prototype.extractZipAsync = function () { return __awaiter(this, void 0, void 0, function () { var filePath, file, unzippedFile, assets, result, _a, _b; return __generator(this, function (_c) { switch (_c.label) { case 0: filePath = "./" + this.filenameWithExtension; if (this.config.enableLog) { console.log("Reading file '" + filePath + "'"); } return [4 /*yield*/, fs.promises.readFile(filePath)]; case 1: file = _c.sent(); if (this.config.enableLog) { console.log("Unzipping file"); } return [4 /*yield*/, JSZip.loadAsync(file)]; case 2: unzippedFile = _c.sent(); if (this.config.enableLog) { console.log("Parsing zip contents"); } return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.assetsName)]; case 3: assets = _c.sent(); _a = {}; _b = { assets: assets }; return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.contentTypesName)]; case 4: _b.contentTypes = _c.sent(); return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.languageVariantsName)]; case 5: _b.languageVariants = _c.sent(); return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.languages)]; case 6: _b.languages = _c.sent(); return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.contentItemsName)]; case 7: _b.contentItems = _c.sent(); return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.contentTypeSnippetsName)]; case 8: _b.contentTypeSnippets = _c.sent(); return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.taxonomiesName)]; case 9: _a.importData = (_b.taxonomies = _c.sent(), _b); return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.assetFoldersName)]; case 10: _a.assetFolders = _c.sent(); return [4 /*yield*/, this.extractBinaryFilesAsync(unzippedFile, assets)]; case 11: _a.binaryFiles = _c.sent(); return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.validationName)]; case 12: _a.validation = _c.sent(); return [4 /*yield*/, this.readAndParseJsonFile(unzippedFile, this.metadataName)]; case 13: result = (_a.metadata = _c.sent(), _a); if (this.config.enableLog) { console.log("Pasing zip completed"); } return [2 /*return*/, result]; } }); }); }; ZipService.prototype.createZipAsync = function (exportData) { return __awaiter(this, void 0, void 0, function () { var zip, assetsFolder, _i, _a, asset, assetIdShortFolder, assetIdFolder, assetFilename, filePath, content; return __generator(this, function (_b) { switch (_b.label) { case 0: zip = new JSZip(); if (this.config.enableLog) { console.log("Parsing json"); } zip.file(this.contentTypesName, JSON.stringify(exportData.data.contentTypes)); zip.file(this.validationName, JSON.stringify(exportData.validation)); zip.file(this.contentItemsName, JSON.stringify(exportData.data.contentItems)); zip.file(this.taxonomiesName, JSON.stringify(exportData.data.taxonomies)); zip.file(this.assetsName, JSON.stringify(exportData.data.assets)); zip.file(this.languageVariantsName, JSON.stringify(exportData.data.languageVariants)); zip.file(this.metadataName, JSON.stringify(exportData.metadata)); zip.file(this.languages, JSON.stringify(exportData.data.languages)); zip.file(this.contentTypeSnippetsName, JSON.stringify(exportData.data.contentTypeSnippets)); zip.file(this.assetFoldersName, JSON.stringify(exportData.data.assetFolders)); assetsFolder = zip.folder(this.filesName); if (this.config.enableLog) { console.log("Adding assets to zip"); } for (_i = 0, _a = exportData.data.assets; _i < _a.length; _i++) { asset = _a[_i]; assetIdShortFolder = assetsFolder.folder(asset.id.substr(0, 3)); assetIdFolder = assetIdShortFolder.folder(asset.id); assetFilename = asset.file_name; assetIdFolder.file(assetFilename, this.getBinaryDataFromUrl(asset.url, this.config.enableLog), { binary: true }); } filePath = './' + this.filenameWithExtension; if (this.config.enableLog) { console.log("Generating zip file '" + filePath + "'"); } return [4 /*yield*/, zip.generateAsync({ type: 'nodebuffer' })]; case 1: content = _b.sent(); console.log("Writing file '" + filePath + "'"); return [4 /*yield*/, fs.promises.writeFile(filePath, content)]; case 2: _b.sent(); console.log("File saved"); return [2 /*return*/]; } }); }); }; ZipService.prototype.extractBinaryFilesAsync = function (zip, assets) { return __awaiter(this, void 0, void 0, function () { var binaryFiles, files, _i, assets_1, asset, assetFile, binaryData; return __generator(this, function (_a) { switch (_a.label) { case 0: binaryFiles = []; files = zip.files; _i = 0, assets_1 = assets; _a.label = 1; case 1: if (!(_i < assets_1.length)) return [3 /*break*/, 4]; asset = assets_1[_i]; assetFile = files[this.getFullAssetPath(asset.id, asset.file_name)]; return [4 /*yield*/, assetFile.async('nodebuffer')]; case 2: binaryData = _a.sent(); binaryFiles.push({ asset: asset, binaryData: binaryData }); _a.label = 3; case 3: _i++; return [3 /*break*/, 1]; case 4: return [2 /*return*/, binaryFiles]; } }); }); }; /** * Gets path to asset within zip folder. Uses tree format using asset ids such as: * "files/3b4/3b42f36c-2e67-4605-a8d3-fee2498e5224/image.jpg" */ ZipService.prototype.getFullAssetPath = function (assetId, filename) { return this.filesName + "/" + assetId.substr(0, 3) + "/" + assetId + "/" + filename; }; ZipService.prototype.readAndParseJsonFile = function (fileContents, filename) { return __awaiter(this, void 0, void 0, function () { var files, file, text; return __generator(this, function (_a) { switch (_a.label) { case 0: files = fileContents.files; file = files[filename]; if (!file) { throw Error("Invalid file '" + filename + "'"); } return [4 /*yield*/, file.async('text')]; case 1: text = _a.sent(); return [2 /*return*/, JSON.parse(text)]; } }); }); }; ZipService.prototype.getBinaryDataFromUrl = function (url, enableLog) { return new Promise(function (resolve, reject) { https_1.get(url, function (res) { if (enableLog) { console.log("Downloading asset: " + url); } var data = []; res.on('data', function (chunk) { data.push(chunk); }) .on('end', function () { var buffer = Buffer.concat(data); resolve(buffer); }) .on('error', function (error) { reject(error); }); }); }); }; return ZipService; }()); exports.ZipService = ZipService; //# sourceMappingURL=zip.service.js.map