@amplience/dc-cli
Version:
Dynamic Content CLI Tool
137 lines (136 loc) • 6.39 kB
JavaScript
;
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;