@dlillyatx/dc-cli
Version:
Dynamic Content CLI Tool
140 lines (139 loc) • 6.94 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';
exports.LOG_FILENAME = (platform = process.platform) => log_helpers_1.getDefaultLogPath('extension', 'export', platform);
exports.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.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 &&
lodash_1.isEqual(a.settings, b.settings) &&
lodash_1.isEqual(a.snippets, b.snippets) &&
lodash_1.isEqual(a.parameters, b.parameters);
exports.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.getExportRecordForExtension = (extension, outputDir, previouslyExportedExtensions) => {
const indexOfExportedExtension = Object.values(previouslyExportedExtensions).findIndex(c => c.name === extension.name);
if (indexOfExportedExtension < 0) {
const filename = 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 (exports.equals(previouslyExportedExtension, extension)) {
return { filename, status: 'UP-TO-DATE', extension };
}
return {
filename,
status: 'UPDATED',
extension
};
};
exports.getExtensionExports = (outputDir, previouslyExportedExtensions, extensionsBeingExported) => {
const allExports = [];
const updatedExportsMap = [];
for (const extension of extensionsBeingExported) {
if (!extension.name) {
continue;
}
const exportRecord = exports.getExportRecordForExtension(extension, outputDir, previouslyExportedExtensions);
allExports.push(exportRecord);
if (exportRecord.status === 'UPDATED') {
updatedExportsMap.push({ uri: extension.name, filename: exportRecord.filename });
}
}
return [allExports, updatedExportsMap];
};
exports.processExtensions = async (outputDir, previouslyExportedExtensions, extensionsBeingExported, log, force) => {
if (extensionsBeingExported.length === 0) {
export_service_1.nothingExportedExit(log, 'No extensions to export from this hub, exiting.');
return;
}
const [allExports, updatedExportsMap] = exports.getExtensionExports(outputDir, previouslyExportedExtensions, extensionsBeingExported);
if (allExports.length === 0 ||
(Object.keys(updatedExportsMap).length > 0 && !(force || (await export_service_1.promptToOverwriteExports(updatedExportsMap, log))))) {
export_service_1.nothingExportedExit(log);
return;
}
await 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;
export_service_1.writeJsonToFile(filename, extension);
}
data.push([filename, extension.name, status]);
}
log.appendLine(table_1.table(data, table_consts_1.streamTableOptions));
};
exports.handler = async (argv) => {
const { dir, id, logFile, force } = argv;
const client = dynamic_content_client_factory_1.default(argv);
const hub = await client.hubs.get(argv.hubId);
const log = logFile.open();
const previouslyExportedExtensions = import_service_1.loadJsonFromDirectory(dir, dc_management_sdk_js_1.Extension);
import_1.validateNoDuplicateExtensionNames(previouslyExportedExtensions);
const storedExtensions = await paginator_1.default(hub.related.extensions.list);
const idArray = id ? (Array.isArray(id) ? id : [id]) : [];
const filteredExtensions = exports.filterExtensionsById(storedExtensions, idArray);
await exports.processExtensions(dir, previouslyExportedExtensions, filteredExtensions, log, force || false);
await log.close();
};