UNPKG

@amplience/dc-cli

Version:
137 lines (136 loc) 6.39 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.doUpdate = exports.doCreate = exports.storedExtensionMapper = exports.filterExtensionsById = exports.validateNoDuplicateExtensionNames = exports.builder = exports.LOG_FILENAME = exports.desc = exports.command = void 0; const dc_management_sdk_js_1 = require("dc-management-sdk-js"); 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 table_1 = require("table"); const table_consts_1 = require("../../common/table/table.consts"); const chalk_1 = __importDefault(require("chalk")); const import_service_1 = require("../../services/import.service"); const log_helpers_1 = require("../../common/log-helpers"); const export_1 = require("./export"); exports.command = 'import <dir>'; exports.desc = 'Import Extensions'; const LOG_FILENAME = (platform = process.platform) => (0, log_helpers_1.getDefaultLogPath)('extension', 'import', platform); exports.LOG_FILENAME = LOG_FILENAME; const builder = (yargs) => { yargs.positional('dir', { describe: 'Directory containing Extensions', type: 'string' }); yargs.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 validateNoDuplicateExtensionNames = (importedExtensions) => { const nameToFilenameMap = new Map(); for (const [filename, extension] of Object.entries(importedExtensions)) { if (extension.name) { const otherFilenames = nameToFilenameMap.get(extension.name) || []; if (filename) { nameToFilenameMap.set(extension.name, [...otherFilenames, filename]); } } } const uniqueDuplicateNames = []; nameToFilenameMap.forEach((filenames, name) => { if (filenames.length > 1) { uniqueDuplicateNames.push([name, filenames]); } }); if (uniqueDuplicateNames.length > 0) { throw new Error(`Extensions must have unique name values. Duplicate values found:-\n${uniqueDuplicateNames .map(([name, filenames]) => ` name: '${name}' in files: [${filenames.map(f => `'${f}'`).join(', ')}]`) .join('\n')}`); } }; exports.validateNoDuplicateExtensionNames = validateNoDuplicateExtensionNames; const filterExtensionsById = (idFilter, importedExtensions) => { for (const [filename, extension] of Object.entries(importedExtensions)) { if (idFilter.indexOf(extension.id) === -1) { delete importedExtensions[filename]; } } }; exports.filterExtensionsById = filterExtensionsById; const storedExtensionMapper = (extension, storedExtensions) => { const found = storedExtensions.find(stored => stored.name === extension.name); const mutatedExtension = found ? { ...extension, id: found.id } : extension; return new dc_management_sdk_js_1.Extension(mutatedExtension); }; exports.storedExtensionMapper = storedExtensionMapper; const doCreate = async (hub, extension, log) => { try { const createdExtension = await hub.related.extensions.create(extension); log.addAction('CREATE', `${createdExtension.id}`); return createdExtension; } catch (err) { throw new Error(`Error creating extension ${extension.name}:\n\n${err}`); } }; exports.doCreate = doCreate; const doUpdate = async (client, extension, log) => { try { const retrievedExtension = await client.extensions.get(extension.id || ''); if ((0, export_1.equals)(retrievedExtension, extension)) { return { extension: retrievedExtension, updateStatus: import_service_1.UpdateStatus.SKIPPED }; } const updatedExtension = await retrievedExtension.related.update(extension); log.addAction('UPDATE', `${retrievedExtension.id}`); return { extension: updatedExtension, updateStatus: import_service_1.UpdateStatus.UPDATED }; } catch (err) { throw new Error(`Error updating extension ${extension.name}: ${err.message}`); } }; exports.doUpdate = doUpdate; const processExtensions = async (extensionsToProcess, client, hub, log) => { const data = []; data.push([chalk_1.default.bold('ID'), chalk_1.default.bold('Name'), chalk_1.default.bold('Result')]); for (const entry of extensionsToProcess) { let status; let extension; if (entry.id) { const result = await (0, exports.doUpdate)(client, entry, log); extension = result.extension; status = result.updateStatus === import_service_1.UpdateStatus.SKIPPED ? 'UP-TO-DATE' : 'UPDATED'; } else { extension = await (0, exports.doCreate)(hub, entry, log); status = 'CREATED'; } data.push([extension.id || '', extension.name, status]); } log.appendLine((0, table_1.table)(data, table_consts_1.streamTableOptions)); }; exports.processExtensions = processExtensions; const handler = async (argv, idFilter) => { const { dir, logFile } = argv; const client = (0, dynamic_content_client_factory_1.default)(argv); const hub = await client.hubs.get(argv.hubId); const log = logFile.open(); const extensions = (0, import_service_1.loadJsonFromDirectory)(dir, dc_management_sdk_js_1.Extension); if (Object.keys(extensions).length === 0) { log.appendLine(`No extensions found in ${dir}`); await log.close(); return; } (0, exports.validateNoDuplicateExtensionNames)(extensions); if (idFilter) { (0, exports.filterExtensionsById)(idFilter, extensions); } const storedExtensions = await (0, paginator_1.default)(hub.related.extensions.list); const extensionsToProcess = Object.values(extensions).map(extension => (0, exports.storedExtensionMapper)(extension, storedExtensions)); await (0, exports.processExtensions)(extensionsToProcess, client, hub, log); await log.close(); }; exports.handler = handler;