UNPKG

contentful-export

Version:

this tool allows you to export a space to a JSON dump

183 lines (181 loc) 6.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = runContentfulExport; var _fs = require("fs"); var _bfj = _interopRequireDefault(require("bfj")); var _bluebird = _interopRequireDefault(require("bluebird")); var _cliTable = _interopRequireDefault(require("cli-table3")); var _listr = _interopRequireDefault(require("listr")); var _listrUpdateRenderer = _interopRequireDefault(require("listr-update-renderer")); var _listrVerboseRenderer = _interopRequireDefault(require("listr-verbose-renderer")); var _lodash = _interopRequireDefault(require("lodash.startcase")); var _mkdirp = _interopRequireDefault(require("mkdirp")); var _differenceInSeconds = require("date-fns/differenceInSeconds"); var _formatDistance = require("date-fns/formatDistance"); var _contentfulBatchLibs = require("contentful-batch-libs"); var _downloadAssets = _interopRequireDefault(require("./tasks/download-assets")); var _getSpaceData = _interopRequireDefault(require("./tasks/get-space-data")); var _initClient = _interopRequireDefault(require("./tasks/init-client")); var _parseOptions = _interopRequireDefault(require("./parseOptions")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const accessP = _bluebird.default.promisify(_fs.access); const tableOptions = { // remove ANSI color codes for better CI/CD compatibility style: { head: [], border: [] } }; function createListrOptions(options) { if (options.useVerboseRenderer) { return { renderer: _listrVerboseRenderer.default }; } return { renderer: _listrUpdateRenderer.default, collapse: false }; } function runContentfulExport(params) { const log = []; const options = (0, _parseOptions.default)(params); const listrOptions = createListrOptions(options); // Setup custom error listener to store errors for later (0, _contentfulBatchLibs.setupLogging)(log); const tasks = new _listr.default([{ title: 'Initialize client', task: (0, _contentfulBatchLibs.wrapTask)(ctx => { try { // CMA client ctx.client = (0, _initClient.default)(options); if (options.deliveryToken && !options.includeDrafts) { // CDA client for fetching only public entries ctx.cdaClient = (0, _initClient.default)(options, true); } return _bluebird.default.resolve(); } catch (err) { return _bluebird.default.reject(err); } }) }, { title: 'Fetching data from space', task: ctx => { return (0, _getSpaceData.default)({ client: ctx.client, cdaClient: ctx.cdaClient, spaceId: options.spaceId, environmentId: options.environmentId, maxAllowedLimit: options.maxAllowedLimit, includeDrafts: options.includeDrafts, includeArchived: options.includeArchived, skipContentModel: options.skipContentModel, skipEditorInterfaces: options.skipEditorInterfaces, skipContent: options.skipContent, skipWebhooks: options.skipWebhooks, skipRoles: options.skipRoles, skipTags: options.skipTags, stripTags: options.stripTags, listrOptions, queryEntries: options.queryEntries, queryAssets: options.queryAssets }); } }, { title: 'Download assets', task: (0, _contentfulBatchLibs.wrapTask)((0, _downloadAssets.default)(options)), skip: ctx => !options.downloadAssets || !Object.prototype.hasOwnProperty.call(ctx.data, 'assets') }, { title: 'Write export log file', task: () => { return new _listr.default([{ title: 'Lookup directory to store the logs', task: ctx => { return accessP(options.exportDir).then(() => { ctx.logDirectoryExists = true; }).catch(() => { ctx.logDirectoryExists = false; }); } }, { title: 'Create log directory', task: () => { return (0, _mkdirp.default)(options.exportDir); }, skip: ctx => !ctx.logDirectoryExists }, { title: 'Writing data to file', task: ctx => { return _bfj.default.write(options.logFilePath, ctx.data, { circular: 'ignore', space: 2 }); } }]); }, skip: () => !options.saveFile }], listrOptions); return tasks.run({ data: {} }).then(ctx => { const resultTypes = Object.keys(ctx.data); if (resultTypes.length) { const resultTable = new _cliTable.default(tableOptions); resultTable.push([{ colSpan: 2, content: 'Exported entities' }]); resultTypes.forEach(type => { resultTable.push([(0, _lodash.default)(type), ctx.data[type].length]); }); console.log(resultTable.toString()); } else { console.log('No data was exported'); } if ('assetDownloads' in ctx) { const downloadsTable = new _cliTable.default(tableOptions); downloadsTable.push([{ colSpan: 2, content: 'Asset file download results' }]); downloadsTable.push(['Successful', ctx.assetDownloads.successCount]); downloadsTable.push(['Warnings ', ctx.assetDownloads.warningCount]); downloadsTable.push(['Errors ', ctx.assetDownloads.errorCount]); console.log(downloadsTable.toString()); } const endTime = new Date(); const durationHuman = (0, _formatDistance.formatDistance)(endTime, options.startTime); const durationSeconds = (0, _differenceInSeconds.differenceInSeconds)(endTime, options.startTime); console.log(`The export took ${durationHuman} (${durationSeconds}s)`); if (options.saveFile) { console.log(`\nStored space data to json file at: ${options.logFilePath}`); } return ctx.data; }).catch(err => { log.push({ ts: new Date().toJSON(), level: 'error', error: err }); }).then(data => { // @todo this should live in batch libs const errorLog = log.filter(logMessage => logMessage.level !== 'info' && logMessage.level !== 'warning'); const displayLog = log.filter(logMessage => logMessage.level !== 'info'); (0, _contentfulBatchLibs.displayErrorLog)(displayLog); if (errorLog.length) { return (0, _contentfulBatchLibs.writeErrorLogFile)(options.errorLogFile, errorLog).then(() => { const multiError = new Error('Errors occured'); multiError.name = 'ContentfulMultiError'; Object.assign(multiError, { errors: errorLog }); throw multiError; }); } console.log('The export was successful.'); return data; }); } module.exports = exports.default;