@amplience/dc-cli
Version:
Dynamic Content CLI Tool
148 lines (147 loc) • 7.36 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.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;