{"version":3,"file":"action.mjs","sources":["../../../../../src/cli/commands/transfer/action.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport {\n  buildTransferTable,\n  createStrapiInstance,\n  DEFAULT_IGNORED_CONTENT_TYPES,\n  formatDiagnostic,\n  loadersFactory,\n  exitMessageText,\n  abortTransfer,\n  getTransferTelemetryPayload,\n  setSignalHandler,\n  getDiffHandler,\n  getAssetsBackupHandler,\n  parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst { createTransferEngine } = engineDataTransfer;\nconst {\n  providers: {\n    createRemoteStrapiDestinationProvider,\n    createLocalStrapiSourceProvider,\n    createLocalStrapiDestinationProvider,\n    createRemoteStrapiSourceProvider,\n  },\n} = strapiDataTransfer;\n\ninterface CmdOptions {\n  from?: URL;\n  fromToken: string;\n  to: URL;\n  toToken: string;\n  verbose?: boolean;\n  only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n  exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n  throttle?: number;\n  force?: boolean;\n}\n/**\n * Transfer command.\n *\n * Transfers data between local Strapi and remote Strapi instances\n */\nexport default async (opts: CmdOptions) => {\n  // Validate inputs from Commander\n  if (!isObject(opts)) {\n    exitWith(1, 'Could not parse command arguments');\n  }\n\n  if (!(opts.from || opts.to) || (opts.from && opts.to)) {\n    exitWith(1, 'Exactly one source (from) or destination (to) option must be provided');\n  }\n\n  const strapi = await createStrapiInstance();\n  let source;\n  let destination;\n\n  // if no URL provided, use local Strapi\n  if (!opts.from) {\n    source = createLocalStrapiSourceProvider({\n      getStrapi: () => strapi,\n    });\n  }\n  // if URL provided, set up a remote source provider\n  else {\n    if (!opts.fromToken) {\n      exitWith(1, 'Missing token for remote destination');\n    }\n\n    source = createRemoteStrapiSourceProvider({\n      getStrapi: () => strapi,\n      url: opts.from,\n      auth: {\n        type: 'token',\n        token: opts.fromToken,\n      },\n    });\n  }\n\n  // if no URL provided, use local Strapi\n  if (!opts.to) {\n    destination = createLocalStrapiDestinationProvider({\n      getStrapi: () => strapi,\n      strategy: 'restore',\n      restore: parseRestoreFromOptions(opts),\n    });\n  }\n  // if URL provided, set up a remote destination provider\n  else {\n    if (!opts.toToken) {\n      exitWith(1, 'Missing token for remote destination');\n    }\n\n    destination = createRemoteStrapiDestinationProvider({\n      url: opts.to,\n      auth: {\n        type: 'token',\n        token: opts.toToken,\n      },\n      strategy: 'restore',\n      restore: parseRestoreFromOptions(opts),\n    });\n  }\n\n  if (!source || !destination) {\n    exitWith(1, 'Could not create providers');\n  }\n\n  const engine = createTransferEngine(source, destination, {\n    versionStrategy: 'exact',\n    schemaStrategy: 'strict',\n    exclude: opts.exclude,\n    only: opts.only,\n    throttle: opts.throttle,\n    transforms: {\n      links: [\n        {\n          filter(link) {\n            return (\n              !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n              !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n            );\n          },\n        },\n      ],\n      entities: [\n        {\n          filter(entity) {\n            return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n          },\n        },\n      ],\n    },\n  });\n\n  engine.diagnostics.onDiagnostic(formatDiagnostic('transfer', opts.verbose));\n\n  const progress = engine.progress.stream;\n\n  const { updateLoader } = loadersFactory();\n\n  engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'transfer' }));\n\n  engine.addErrorHandler(\n    'ASSETS_DIRECTORY_ERR',\n    getAssetsBackupHandler(engine, { force: opts.force, action: 'transfer' })\n  );\n\n  progress.on(`stage::start`, ({ stage, data }) => {\n    updateLoader(stage, data).start();\n  });\n\n  progress.on('stage::finish', ({ stage, data }) => {\n    updateLoader(stage, data).succeed();\n  });\n\n  progress.on('stage::progress', ({ stage, data }) => {\n    updateLoader(stage, data);\n  });\n\n  progress.on('stage::error', ({ stage, data }) => {\n    updateLoader(stage, data).fail();\n  });\n\n  progress.on('transfer::start', async () => {\n    console.log(`Starting transfer...`);\n\n    await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n  });\n\n  let results: Awaited<ReturnType<typeof engine.transfer>>;\n  try {\n    // Abort transfer if user interrupts process\n    setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n    results = await engine.transfer();\n\n    // Note: we need to await telemetry or else the process ends before it is sent\n    await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n    try {\n      const table = buildTransferTable(results.engine);\n      console.log(table?.toString());\n    } catch (e) {\n      console.error('There was an error displaying the results of the transfer.');\n    }\n\n    exitWith(0, exitMessageText('transfer'));\n  } catch (e) {\n    await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n    exitWith(1, exitMessageText('transfer', true));\n  }\n};\n"],"names":["createTransferEngine","engineDataTransfer","providers","createRemoteStrapiDestinationProvider","createLocalStrapiSourceProvider","createLocalStrapiDestinationProvider","createRemoteStrapiSourceProvider","strapiDataTransfer","opts","isObject","exitWith","from","to","strapi","createStrapiInstance","source","destination","getStrapi","fromToken","url","auth","type","token","strategy","restore","parseRestoreFromOptions","toToken","engine","versionStrategy","schemaStrategy","exclude","only","throttle","transforms","links","filter","link","DEFAULT_IGNORED_CONTENT_TYPES","includes","left","right","entities","entity","diagnostics","onDiagnostic","formatDiagnostic","verbose","progress","stream","updateLoader","loadersFactory","onSchemaDiff","getDiffHandler","force","action","addErrorHandler","getAssetsBackupHandler","on","stage","data","start","succeed","fail","console","log","telemetry","send","getTransferTelemetryPayload","results","setSignalHandler","abortTransfer","transfer","table","buildTransferTable","toString","e","error","exitMessageText"],"mappings":"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"}