UNPKG

@strapi/strapi

Version:

An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite

1 lines • 29.8 kB
{"version":3,"file":"data-transfer.mjs","sources":["../../../../src/cli/utils/data-transfer.ts"],"sourcesContent":["import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { Command, Option } from 'commander';\nimport { configs, createLogger, type winston, formats } from '@strapi/logger';\nimport { createStrapi, compileStrapi } from '@strapi/core';\nimport ora from 'ora';\nimport { merge } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport { readableBytes, exitWith } from './helpers';\nimport { getParseListWithChoices, parseInteger, confirmMessage } from './commander';\n\nconst {\n errors: { TransferEngineInitializationError },\n} = engineDataTransfer;\n\nconst exitMessageText = (process: string, error = false) => {\n const processCapitalized = process[0].toUpperCase() + process.slice(1);\n\n if (!error) {\n return chalk.bold(\n chalk.green(`${processCapitalized} process has been completed successfully!`)\n );\n }\n\n return chalk.bold(chalk.red(`${processCapitalized} process failed.`));\n};\n\nconst pad = (n: number) => {\n return (n < 10 ? '0' : '') + String(n);\n};\n\nconst yyyymmddHHMMSS = () => {\n const date = new Date();\n\n return (\n date.getFullYear() +\n pad(date.getMonth() + 1) +\n pad(date.getDate()) +\n pad(date.getHours()) +\n pad(date.getMinutes()) +\n pad(date.getSeconds())\n );\n};\n\nconst getDefaultExportName = () => {\n return `export_${yyyymmddHHMMSS()}`;\n};\n\ntype ResultData = engineDataTransfer.ITransferResults<\n engineDataTransfer.ISourceProvider,\n engineDataTransfer.IDestinationProvider\n>['engine'];\n\nconst buildTransferTable = (resultData: ResultData) => {\n if (!resultData) {\n return;\n }\n\n // Build pretty table\n const table = new Table({\n head: ['Type', 'Count', 'Size'].map((text) => chalk.bold.blue(text)),\n });\n\n let totalBytes = 0;\n let totalItems = 0;\n (Object.keys(resultData) as engineDataTransfer.TransferStage[]).forEach((stage) => {\n const item = resultData[stage];\n\n if (!item) {\n return;\n }\n\n table.push([\n { hAlign: 'left', content: chalk.bold(stage) },\n { hAlign: 'right', content: item.count },\n { hAlign: 'right', content: `${readableBytes(item.bytes, 1, 11)} ` },\n ]);\n totalBytes += item.bytes;\n totalItems += item.count;\n\n if (item.aggregates) {\n (Object.keys(item.aggregates) as (keyof typeof item.aggregates)[])\n .sort()\n .forEach((subkey) => {\n if (!item.aggregates) {\n return;\n }\n\n const subitem = item.aggregates[subkey];\n\n table.push([\n { hAlign: 'left', content: `-- ${chalk.bold.grey(subkey)}` },\n { hAlign: 'right', content: chalk.grey(subitem.count) },\n { hAlign: 'right', content: chalk.grey(`(${readableBytes(subitem.bytes, 1, 11)})`) },\n ]);\n });\n }\n });\n table.push([\n { hAlign: 'left', content: chalk.bold.green('Total') },\n { hAlign: 'right', content: chalk.bold.green(totalItems) },\n { hAlign: 'right', content: `${chalk.bold.green(readableBytes(totalBytes, 1, 11))} ` },\n ]);\n\n return table;\n};\n\nconst DEFAULT_IGNORED_CONTENT_TYPES = [\n 'admin::permission',\n 'admin::user',\n 'admin::role',\n 'admin::api-token',\n 'admin::api-token-permission',\n 'admin::transfer-token',\n 'admin::transfer-token-permission',\n 'admin::audit-log',\n 'plugin::content-releases.release',\n 'plugin::content-releases.release-action',\n];\n\nconst abortTransfer = async ({\n engine,\n strapi,\n}: {\n engine: engineDataTransfer.TransferEngine;\n strapi: Core.Strapi;\n}) => {\n try {\n await engine.abortTransfer();\n await strapi.destroy();\n } catch (e) {\n // ignore because there's not much else we can do\n return false;\n }\n return true;\n};\n\nconst setSignalHandler = async (\n handler: (...args: unknown[]) => void,\n signals = ['SIGINT', 'SIGTERM', 'SIGQUIT']\n) => {\n signals.forEach((signal) => {\n // We specifically remove ALL listeners because we have to clear the one added in Strapi bootstrap that has a process.exit\n // TODO: Ideally Strapi bootstrap would not add that listener, and then this could be more flexible and add/remove only what it needs to\n process.removeAllListeners(signal);\n process.on(signal, handler);\n });\n};\n\nconst createStrapiInstance = async (opts: { logLevel?: string } = {}): Promise<Core.Strapi> => {\n try {\n const appContext = await compileStrapi();\n const app = createStrapi({ ...opts, ...appContext });\n\n app.log.level = opts.logLevel || 'error';\n return await app.load();\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ECONNREFUSED') {\n throw new Error('Process failed. Check the database connection with your Strapi project.');\n }\n\n throw error;\n }\n};\n\nconst transferDataTypes = Object.keys(engineDataTransfer.TransferGroupPresets);\n\nconst throttleOption = new Option(\n '--throttle <delay after each entity>',\n `Add a delay in milliseconds between each transferred entity`\n)\n .argParser(parseInteger)\n .hideHelp(); // This option is not publicly documented\n\nconst excludeOption = new Option(\n '--exclude <comma-separated data types>',\n `Exclude data using comma-separated types. Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"exclude\"'));\n\nconst onlyOption = new Option(\n '--only <command-separated data types>',\n `Include only these types of data (plus schemas). Available types: ${transferDataTypes.join(',')}`\n).argParser(getParseListWithChoices(transferDataTypes, 'Invalid options for \"only\"'));\n\nconst validateExcludeOnly = (command: Command) => {\n const { exclude, only } = command.opts();\n if (!only || !exclude) {\n return;\n }\n\n const choicesInBoth = only.filter((n: string) => {\n return exclude.indexOf(n) !== -1;\n });\n if (choicesInBoth.length > 0) {\n exitWith(\n 1,\n `Data types may not be used in both \"exclude\" and \"only\" in the same command. Found in both: ${choicesInBoth.join(\n ','\n )}`\n );\n }\n};\n\nconst errorColors = {\n fatal: chalk.red,\n error: chalk.red,\n silly: chalk.yellow,\n} as const;\n\nconst formatDiagnostic = (\n operation: string,\n info?: boolean\n): Parameters<engineDataTransfer.TransferEngine['diagnostics']['onDiagnostic']>[0] => {\n // Create log file for all incoming diagnostics\n let logger: undefined | winston.Logger;\n const getLogger = () => {\n if (!logger) {\n logger = createLogger(\n configs.createOutputFileConfiguration(`${operation}_${Date.now()}.log`, {\n level: 'info',\n format: formats?.detailedLogs,\n })\n );\n }\n return logger;\n };\n\n // We don't want to write a log file until there is something to be logged\n\n return ({ details, kind }) => {\n try {\n if (kind === 'error') {\n const { message, severity = 'fatal' } = details;\n\n const colorizeError = errorColors[severity];\n const errorMessage = colorizeError(`[${severity.toUpperCase()}] ${message}`);\n\n getLogger().error(errorMessage);\n }\n if (kind === 'info' && info) {\n const { message, params, origin } = details;\n\n const msg = `[${origin ?? 'transfer'}] ${message}\\n${params ? JSON.stringify(params, null, 2) : ''}`;\n\n getLogger().info(msg);\n }\n if (kind === 'warning') {\n const { origin, message } = details;\n\n getLogger().warn(`(${origin ?? 'transfer'}) ${message}`);\n }\n } catch (err) {\n getLogger().error(err);\n }\n };\n};\n\ntype Loaders = {\n [key in engineDataTransfer.TransferStage]: ora.Ora;\n};\n\ntype Data = {\n [key in engineDataTransfer.TransferStage]?: {\n startTime?: number;\n endTime?: number;\n bytes?: number;\n count?: number;\n };\n};\n\nconst loadersFactory = (defaultLoaders: Loaders = {} as Loaders) => {\n const loaders = defaultLoaders;\n const updateLoader = (stage: engineDataTransfer.TransferStage, data: Data) => {\n if (!(stage in loaders)) {\n createLoader(stage);\n }\n\n const stageData = data[stage];\n const elapsedTime = stageData?.startTime\n ? (stageData?.endTime || Date.now()) - stageData.startTime\n : 0;\n const size = `size: ${readableBytes(stageData?.bytes ?? 0)}`;\n const elapsed = `elapsed: ${elapsedTime} ms`;\n const speed =\n elapsedTime > 0 ? `(${readableBytes(((stageData?.bytes ?? 0) * 1000) / elapsedTime)}/s)` : '';\n\n loaders[stage].text = `${stage}: ${stageData?.count ?? 0} transferred (${size}) (${elapsed}) ${\n !stageData?.endTime ? speed : ''\n }`;\n\n return loaders[stage];\n };\n\n const createLoader = (stage: engineDataTransfer.TransferStage) => {\n Object.assign(loaders, { [stage]: ora() });\n return loaders[stage];\n };\n\n const getLoader = (stage: engineDataTransfer.TransferStage) => {\n return loaders[stage];\n };\n\n return {\n updateLoader,\n createLoader,\n getLoader,\n };\n};\n\n/**\n * Get the telemetry data to be sent for a didDEITSProcess* event from an initialized transfer engine object\n */\nconst getTransferTelemetryPayload = (engine: engineDataTransfer.TransferEngine) => {\n return {\n eventProperties: {\n source: engine?.sourceProvider?.name,\n destination: engine?.destinationProvider?.name,\n },\n };\n};\n\n/**\n * Get a transfer engine schema diff handler that confirms with the user before bypassing a schema check\n */\nconst getDiffHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.SchemaDiffHandlerContext,\n next: (ctx: engineDataTransfer.SchemaDiffHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n let workflowsStatus;\n const source = 'Schema Integrity';\n\n Object.entries(context.diffs).forEach(([uid, diffs]) => {\n for (const diff of diffs) {\n const path = [uid].concat(diff.path).join('.');\n const endPath = diff.path[diff.path.length - 1];\n\n // Catch known features\n if (\n uid === 'plugin::review-workflows.workflow' ||\n uid === 'plugin::review-workflows.workflow-stage' ||\n endPath?.startsWith('strapi_stage') ||\n endPath?.startsWith('strapi_assignee')\n ) {\n workflowsStatus = diff.kind;\n }\n // handle generic cases\n else if (diff.kind === 'added') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} does not exist on source`), source);\n } else if (diff.kind === 'deleted') {\n engine.reportWarning(\n chalk.red(`${chalk.bold(path)} does not exist on destination`),\n source\n );\n } else if (diff.kind === 'modified') {\n engine.reportWarning(chalk.red(`${chalk.bold(path)} has a different data type`), source);\n }\n }\n });\n\n // output the known feature warnings\n if (workflowsStatus === 'added') {\n engine.reportWarning(chalk.red(`Review workflows feature does not exist on source`), source);\n } else if (workflowsStatus === 'deleted') {\n engine.reportWarning(\n chalk.red(`Review workflows feature does not exist on destination`),\n source\n );\n } else if (workflowsStatus === 'modified') {\n engine.panic(\n new TransferEngineInitializationError('Unresolved differences in schema [review workflows]')\n );\n }\n\n const confirmed = await confirmMessage(\n 'There are differences in schema between the source and destination, and the data listed above will be lost. Are you sure you want to continue?',\n {\n force,\n }\n );\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n\n if (confirmed) {\n context.ignoredDiffs = merge(context.diffs, context.ignoredDiffs);\n }\n\n return next(context);\n };\n};\n\nconst getAssetsBackupHandler = (\n engine: engineDataTransfer.TransferEngine,\n {\n force,\n action,\n }: {\n force?: boolean;\n action: string;\n }\n) => {\n return async (\n context: engineDataTransfer.ErrorHandlerContext,\n next: (ctx: engineDataTransfer.ErrorHandlerContext) => void\n ) => {\n // if we abort here, we need to actually exit the process because of conflict with inquirer prompt\n setSignalHandler(async () => {\n await abortTransfer({ engine, strapi: strapi as Core.Strapi });\n exitWith(1, exitMessageText(action, true));\n });\n\n console.warn(\n 'The backup for the assets could not be created inside the public directory. Ensure Strapi has write permissions on the public directory.'\n );\n const confirmed = await confirmMessage(\n 'Do you want to continue without backing up your public/uploads files?',\n {\n force,\n }\n );\n\n if (confirmed) {\n context.ignore = true;\n }\n\n // reset handler back to normal\n setSignalHandler(() => abortTransfer({ engine, strapi: strapi as Core.Strapi }));\n return next(context);\n };\n};\n\nconst shouldSkipStage = (\n opts: Partial<engineDataTransfer.ITransferEngineOptions>,\n dataKind: engineDataTransfer.TransferFilterPreset\n) => {\n if (opts.exclude?.includes(dataKind)) {\n return true;\n }\n if (opts.only) {\n return !opts.only.includes(dataKind);\n }\n\n return false;\n};\n\ntype RestoreConfig = NonNullable<\n strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore']\n>;\n\n// Based on exclude/only from options, create the restore object to match\nconst parseRestoreFromOptions = (opts: Partial<engineDataTransfer.ITransferEngineOptions>) => {\n const entitiesOptions: RestoreConfig['entities'] = {\n exclude: DEFAULT_IGNORED_CONTENT_TYPES,\n include: undefined,\n };\n\n // if content is not included, send an empty array for include\n if ((opts.only && !opts.only.includes('content')) || opts.exclude?.includes('content')) {\n entitiesOptions.include = [];\n }\n\n const restoreConfig: strapiDataTransfer.providers.ILocalStrapiDestinationProviderOptions['restore'] =\n {\n entities: entitiesOptions,\n assets: !shouldSkipStage(opts, 'files'),\n configuration: {\n webhook: !shouldSkipStage(opts, 'config'),\n coreStore: !shouldSkipStage(opts, 'config'),\n },\n };\n\n return restoreConfig;\n};\n\nexport {\n loadersFactory,\n buildTransferTable,\n getDefaultExportName,\n getTransferTelemetryPayload,\n DEFAULT_IGNORED_CONTENT_TYPES,\n createStrapiInstance,\n excludeOption,\n exitMessageText,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n formatDiagnostic,\n abortTransfer,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n shouldSkipStage,\n parseRestoreFromOptions,\n};\n"],"names":["errors","TransferEngineInitializationError","engineDataTransfer","exitMessageText","process","error","processCapitalized","toUpperCase","slice","chalk","bold","green","red","pad","n","String","yyyymmddHHMMSS","date","Date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getDefaultExportName","buildTransferTable","resultData","table","Table","head","map","text","blue","totalBytes","totalItems","Object","keys","forEach","stage","item","push","hAlign","content","count","readableBytes","bytes","aggregates","sort","subkey","subitem","grey","DEFAULT_IGNORED_CONTENT_TYPES","abortTransfer","engine","strapi","destroy","e","setSignalHandler","handler","signals","signal","removeAllListeners","on","createStrapiInstance","opts","appContext","compileStrapi","app","createStrapi","log","level","logLevel","load","Error","code","transferDataTypes","TransferGroupPresets","throttleOption","Option","argParser","parseInteger","hideHelp","excludeOption","join","getParseListWithChoices","onlyOption","validateExcludeOnly","command","exclude","only","choicesInBoth","filter","indexOf","length","exitWith","errorColors","fatal","silly","yellow","formatDiagnostic","operation","info","logger","getLogger","createLogger","configs","createOutputFileConfiguration","now","format","formats","detailedLogs","details","kind","message","severity","colorizeError","errorMessage","params","origin","msg","JSON","stringify","warn","err","loadersFactory","defaultLoaders","loaders","updateLoader","data","createLoader","stageData","elapsedTime","startTime","endTime","size","elapsed","speed","assign","ora","getLoader","getTransferTelemetryPayload","eventProperties","source","sourceProvider","name","destination","destinationProvider","getDiffHandler","force","action","context","next","workflowsStatus","entries","diffs","uid","diff","path","concat","endPath","startsWith","reportWarning","panic","confirmed","confirmMessage","ignoredDiffs","merge","getAssetsBackupHandler","console","ignore","shouldSkipStage","dataKind","includes","parseRestoreFromOptions","entitiesOptions","include","undefined","restoreConfig","entities","assets","configuration","webhook","coreStore"],"mappings":"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"}