{"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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"}