UNPKG

burdy

Version:

Open Source Headless Platform

174 lines (173 loc) 8.24 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 __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.importContent = exports.exportContent = void 0; const typeorm_1 = require("typeorm"); const utility_1 = require("../../admin/helpers/utility"); const fs_extra_1 = __importDefault(require("fs-extra")); const path_util_1 = __importDefault(require("../../scripts/util/path.util")); const content_type_bl_1 = require("./content-type-bl"); const assets_bl_1 = require("./assets.bl"); const post_bl_1 = require("./post.bl"); const logger_1 = __importDefault(require("../../shared/features/logger")); const rimraf_1 = __importDefault(require("rimraf")); const console_output_util_1 = __importDefault(require("../../scripts/util/console-output.util")); const archiver_1 = __importDefault(require("archiver")); const tags_bl_1 = require("./tags.bl"); const async_1 = __importDefault(require("async")); const unzipper_1 = __importDefault(require("unzipper")); const path_1 = __importDefault(require("path")); const defer_promise_1 = __importDefault(require("defer-promise")); const handlers = [ { type: 'tags', exportBinding: tags_bl_1.exportTags, importBinding: tags_bl_1.importTags, filename: 'tags.json', }, { type: 'contentTypes', exportBinding: content_type_bl_1.exportContentTypes, importBinding: content_type_bl_1.importContentTypes, filename: 'contentTypes.json', }, { type: 'assets', exportBinding: assets_bl_1.exportAssets, importBinding: assets_bl_1.importAssets, filename: 'assets.json', }, { type: 'posts', exportBinding: post_bl_1.exportPosts, importBinding: post_bl_1.importPosts, filename: 'posts.json', }, ]; const exportContent = ({ output, force = false, include, } = {}) => __awaiter(void 0, void 0, void 0, function* () { yield (0, typeorm_1.getManager)().transaction((entityManager) => __awaiter(void 0, void 0, void 0, function* () { yield (() => __awaiter(void 0, void 0, void 0, function* () { if (!output) return; if (!output.endsWith('.zip')) { console_output_util_1.default.info('File not ending with .zip, appending extension to name.'); output = `${output}.zip`; } const fileExists = yield fs_extra_1.default.pathExists(output); if (fileExists && !force) { console_output_util_1.default.error(`File ${output} already exists. Skipping...`); return; } if (fileExists && force) { console_output_util_1.default.info('Force flag provided, deleting previous entry.'); yield new Promise((resolve) => (0, rimraf_1.default)(output, resolve)); } }))(); yield new Promise((resolve) => (0, rimraf_1.default)(path_util_1.default.burdyRoot('export'), resolve)); yield fs_extra_1.default.ensureDir(path_util_1.default.burdyRoot('export')); const exporters = !include ? handlers : handlers.filter(({ type }) => include.includes(type)); let exports = yield async_1.default.map(exporters, (exporter, next) => __awaiter(void 0, void 0, void 0, function* () { try { const { exportBinding, filename } = exporter; const result = yield exportBinding({ entityManager }); next(null, { result, filename }); } catch (e) { logger_1.default.error(`Failed to export ${exporter.type}. Skipping...`); next(null, null); } })); exports = exports.map((i) => i); yield Promise.all(exports.map(({ result, filename }) => { return fs_extra_1.default.writeJson(path_util_1.default.burdyRoot('export', filename), result); })); if (output) { const deferred = (0, defer_promise_1.default)(); const outputStream = fs_extra_1.default.createWriteStream(output); const zipArchive = (0, archiver_1.default)('zip'); yield zipArchive.directory(path_util_1.default.burdyRoot('export'), false); zipArchive.pipe(outputStream); outputStream.on('close', () => { console_output_util_1.default.info(`${zipArchive.pointer()} total bytes written to zip file.`); deferred.resolve(); }); outputStream.on('error', (e) => { console.log(e); deferred.reject(e); }); yield zipArchive.finalize(); yield deferred.promise; } console_output_util_1.default.info('Export finished.'); })); }); exports.exportContent = exportContent; const importContent = ({ user, options, file, include, }) => __awaiter(void 0, void 0, void 0, function* () { yield (0, typeorm_1.getManager)().transaction((entityManager) => __awaiter(void 0, void 0, void 0, function* () { const force = (0, utility_1.isTrue)(options === null || options === void 0 ? void 0 : options.force); const publish = (0, utility_1.isTrue)(options === null || options === void 0 ? void 0 : options.publish); logger_1.default.info('Starting import'); const entry = path_util_1.default.burdyRoot('export'); yield (() => __awaiter(void 0, void 0, void 0, function* () { if (!file) return; const fileInput = file; const zipExists = yield fs_extra_1.default.pathExists(file); if (!zipExists) { console_output_util_1.default.info('Zip not found. Skipping archive deflation...'); return; } yield new Promise((resolve) => (0, rimraf_1.default)(entry, resolve)); console_output_util_1.default.info(`Exporting ${file}...`); yield fs_extra_1.default .createReadStream(fileInput) .pipe(unzipper_1.default.Extract({ path: entry })) .promise(); }))(); const importers = !include ? handlers : handlers.filter(({ type }) => include.includes(type)); let imports = yield async_1.default.map(importers, (handler, next) => __awaiter(void 0, void 0, void 0, function* () { try { const { filename, importBinding } = handler; const result = yield fs_extra_1.default.readJson(path_1.default.join(entry, filename)); next(null, { result, importBinding }); } catch (e) { next(null, null); } })); imports = imports.filter((i) => i); yield async_1.default.each(imports, (importData, next) => __awaiter(void 0, void 0, void 0, function* () { try { const { result, importBinding } = importData; yield importBinding({ entityManager, user, data: result, options: { force, publish }, }); next(); } catch (e) { next(e); } })); logger_1.default.info('Import finished.'); console_output_util_1.default.info('Import finished.'); })); }); exports.importContent = importContent;