UNPKG

@amplience/dc-cli

Version:
148 lines (147 loc) 7.36 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.handler = exports.processExtensions = exports.getExtensionExports = exports.getExportRecordForExtension = exports.filterExtensionsById = exports.equals = exports.builder = exports.LOG_FILENAME = exports.desc = exports.command = void 0; const dynamic_content_client_factory_1 = __importDefault(require("../../services/dynamic-content-client-factory")); const paginator_1 = __importDefault(require("../../common/dc-management-sdk-js/paginator")); const dc_management_sdk_js_1 = require("dc-management-sdk-js"); const table_1 = require("table"); const table_consts_1 = require("../../common/table/table.consts"); const chalk_1 = __importDefault(require("chalk")); const export_service_1 = require("../../services/export.service"); const import_service_1 = require("../../services/import.service"); const lodash_1 = require("lodash"); const directory_utils_1 = require("../../common/import/directory-utils"); const log_helpers_1 = require("../../common/log-helpers"); const import_1 = require("./import"); exports.command = 'export <dir>'; exports.desc = 'Export Extensions'; const LOG_FILENAME = (platform = process.platform) => (0, log_helpers_1.getDefaultLogPath)('extension', 'export', platform); exports.LOG_FILENAME = LOG_FILENAME; const builder = (yargs) => { yargs .positional('dir', { describe: 'Output directory for the exported Extensions', type: 'string' }) .option('id', { type: 'string', describe: 'The ID of an Extension to be exported.\nIf no --id option is given, all extensions for the hub are exported.\nA single --id option may be given to export a single extension.\nMultiple --id options may be given to export multiple extensions at the same time.', requiresArg: true }) .alias('f', 'force') .option('f', { type: 'boolean', boolean: true, describe: 'Overwrite extensions without asking.' }) .option('logFile', { type: 'string', default: exports.LOG_FILENAME, describe: 'Path to a log file to write to.', coerce: log_helpers_1.createLog }); }; exports.builder = builder; const equals = (a, b) => a.name === b.name && a.label === b.label && a.height === b.height && a.description === b.description && a.url === b.url && a.status === b.status && (0, lodash_1.isEqual)(a.settings, b.settings) && (0, lodash_1.isEqual)(a.snippets, b.snippets) && (0, lodash_1.isEqual)(a.parameters, b.parameters); exports.equals = equals; const filterExtensionsById = (listToFilter, extensionUriList) => { if (extensionUriList.length === 0) { return listToFilter; } const unmatchedExtensionUriList = extensionUriList.filter(id => !listToFilter.some(extension => extension.id === id)); if (unmatchedExtensionUriList.length > 0) { throw new Error(`The following extension URI(s) could not be found: [${unmatchedExtensionUriList .map(u => `'${u}'`) .join(', ')}].\nNothing was exported, exiting.`); } return listToFilter.filter(extension => extensionUriList.some(id => extension.id === id)); }; exports.filterExtensionsById = filterExtensionsById; const getExportRecordForExtension = (extension, outputDir, previouslyExportedExtensions) => { const indexOfExportedExtension = Object.values(previouslyExportedExtensions).findIndex(c => c.name === extension.name); if (indexOfExportedExtension < 0) { const filename = (0, export_service_1.uniqueFilenamePath)(outputDir, extension.name, 'json', Object.keys(previouslyExportedExtensions)); previouslyExportedExtensions[filename] = extension; return { filename: filename, status: 'CREATED', extension }; } const filename = Object.keys(previouslyExportedExtensions)[indexOfExportedExtension]; const previouslyExportedExtension = Object.values(previouslyExportedExtensions)[indexOfExportedExtension]; if ((0, exports.equals)(previouslyExportedExtension, extension)) { return { filename, status: 'UP-TO-DATE', extension }; } return { filename, status: 'UPDATED', extension }; }; exports.getExportRecordForExtension = getExportRecordForExtension; const getExtensionExports = (outputDir, previouslyExportedExtensions, extensionsBeingExported) => { const allExports = []; const updatedExportsMap = []; for (const extension of extensionsBeingExported) { if (!extension.name) { continue; } const exportRecord = (0, exports.getExportRecordForExtension)(extension, outputDir, previouslyExportedExtensions); allExports.push(exportRecord); if (exportRecord.status === 'UPDATED') { updatedExportsMap.push({ uri: extension.name, filename: exportRecord.filename }); } } return [allExports, updatedExportsMap]; }; exports.getExtensionExports = getExtensionExports; const processExtensions = async (outputDir, previouslyExportedExtensions, extensionsBeingExported, log, force) => { if (extensionsBeingExported.length === 0) { (0, export_service_1.nothingExportedExit)(log, 'No extensions to export from this hub, exiting.'); return; } const [allExports, updatedExportsMap] = (0, exports.getExtensionExports)(outputDir, previouslyExportedExtensions, extensionsBeingExported); if (allExports.length === 0 || (Object.keys(updatedExportsMap).length > 0 && !(force || (await (0, export_service_1.promptToOverwriteExports)(updatedExportsMap, log))))) { (0, export_service_1.nothingExportedExit)(log); return; } await (0, directory_utils_1.ensureDirectoryExists)(outputDir); const data = []; data.push([chalk_1.default.bold('File'), chalk_1.default.bold('Name'), chalk_1.default.bold('Result')]); for (const { filename, status, extension } of allExports) { if (status !== 'UP-TO-DATE') { delete extension.id; (0, export_service_1.writeJsonToFile)(filename, extension); } data.push([filename, extension.name, status]); } log.appendLine((0, table_1.table)(data, table_consts_1.streamTableOptions)); }; exports.processExtensions = processExtensions; const handler = async (argv) => { const { dir, id, logFile, force } = argv; const client = (0, dynamic_content_client_factory_1.default)(argv); const hub = await client.hubs.get(argv.hubId); const log = logFile.open(); const previouslyExportedExtensions = (0, import_service_1.loadJsonFromDirectory)(dir, dc_management_sdk_js_1.Extension); (0, import_1.validateNoDuplicateExtensionNames)(previouslyExportedExtensions); const storedExtensions = await (0, paginator_1.default)(hub.related.extensions.list); const idArray = id ? (Array.isArray(id) ? id : [id]) : []; const filteredExtensions = (0, exports.filterExtensionsById)(storedExtensions, idArray); await (0, exports.processExtensions)(dir, previouslyExportedExtensions, filteredExtensions, log, force || false); await log.close(); }; exports.handler = handler;