@strapi/strapi 5.50.2 → 5.51.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/cli/commands/export/action.d.ts +3 -0
  2. package/dist/cli/commands/export/action.d.ts.map +1 -1
  3. package/dist/cli/commands/export/command.d.ts.map +1 -1
  4. package/dist/cli/commands/import/action.d.ts +3 -0
  5. package/dist/cli/commands/import/action.d.ts.map +1 -1
  6. package/dist/cli/commands/import/command.d.ts.map +1 -1
  7. package/dist/cli/commands/transfer/action.d.ts +3 -0
  8. package/dist/cli/commands/transfer/action.d.ts.map +1 -1
  9. package/dist/cli/commands/transfer/command.d.ts.map +1 -1
  10. package/dist/cli/utils/data-transfer.d.ts +56 -4
  11. package/dist/cli/utils/data-transfer.d.ts.map +1 -1
  12. package/dist/node/core/admin-vite-alias-modules.d.ts +7 -2
  13. package/dist/node/core/admin-vite-alias-modules.d.ts.map +1 -1
  14. package/dist/node/core/admin-vite-aliases.d.ts +22 -1
  15. package/dist/node/core/admin-vite-aliases.d.ts.map +1 -1
  16. package/dist/node/core/admin-vite-optimize-exclude.d.ts.map +1 -1
  17. package/dist/node/core/admin-vite-singleton-modules.d.ts +14 -0
  18. package/dist/node/core/admin-vite-singleton-modules.d.ts.map +1 -0
  19. package/dist/node/core/dependencies.d.ts.map +1 -1
  20. package/dist/node/core/resolve-module.d.ts +14 -2
  21. package/dist/node/core/resolve-module.d.ts.map +1 -1
  22. package/dist/node/create-build-context.d.ts.map +1 -1
  23. package/dist/node/vite/config.d.ts.map +1 -1
  24. package/dist/node/webpack/config.d.ts.map +1 -1
  25. package/dist/package.json.js +1 -1
  26. package/dist/package.json.mjs +1 -1
  27. package/dist/src/cli/commands/export/action.js +7 -17
  28. package/dist/src/cli/commands/export/action.js.map +1 -1
  29. package/dist/src/cli/commands/export/action.mjs +8 -18
  30. package/dist/src/cli/commands/export/action.mjs.map +1 -1
  31. package/dist/src/cli/commands/export/command.js +1 -1
  32. package/dist/src/cli/commands/export/command.js.map +1 -1
  33. package/dist/src/cli/commands/export/command.mjs +2 -2
  34. package/dist/src/cli/commands/export/command.mjs.map +1 -1
  35. package/dist/src/cli/commands/import/action.js +8 -16
  36. package/dist/src/cli/commands/import/action.js.map +1 -1
  37. package/dist/src/cli/commands/import/action.mjs +9 -17
  38. package/dist/src/cli/commands/import/action.mjs.map +1 -1
  39. package/dist/src/cli/commands/import/command.js +1 -1
  40. package/dist/src/cli/commands/import/command.js.map +1 -1
  41. package/dist/src/cli/commands/import/command.mjs +2 -2
  42. package/dist/src/cli/commands/import/command.mjs.map +1 -1
  43. package/dist/src/cli/commands/transfer/action.js +7 -17
  44. package/dist/src/cli/commands/transfer/action.js.map +1 -1
  45. package/dist/src/cli/commands/transfer/action.mjs +8 -18
  46. package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
  47. package/dist/src/cli/commands/transfer/command.js +1 -1
  48. package/dist/src/cli/commands/transfer/command.js.map +1 -1
  49. package/dist/src/cli/commands/transfer/command.mjs +2 -2
  50. package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
  51. package/dist/src/cli/utils/data-transfer.js +148 -10
  52. package/dist/src/cli/utils/data-transfer.js.map +1 -1
  53. package/dist/src/cli/utils/data-transfer.mjs +138 -12
  54. package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
  55. package/dist/src/node/core/admin-vite-alias-modules.js +10 -1
  56. package/dist/src/node/core/admin-vite-alias-modules.js.map +1 -1
  57. package/dist/src/node/core/admin-vite-alias-modules.mjs +10 -2
  58. package/dist/src/node/core/admin-vite-alias-modules.mjs.map +1 -1
  59. package/dist/src/node/core/admin-vite-aliases.js +44 -5
  60. package/dist/src/node/core/admin-vite-aliases.js.map +1 -1
  61. package/dist/src/node/core/admin-vite-aliases.mjs +44 -7
  62. package/dist/src/node/core/admin-vite-aliases.mjs.map +1 -1
  63. package/dist/src/node/core/admin-vite-optimize-exclude.js +4 -0
  64. package/dist/src/node/core/admin-vite-optimize-exclude.js.map +1 -1
  65. package/dist/src/node/core/admin-vite-optimize-exclude.mjs +4 -0
  66. package/dist/src/node/core/admin-vite-optimize-exclude.mjs.map +1 -1
  67. package/dist/src/node/core/admin-vite-singleton-modules.js +24 -0
  68. package/dist/src/node/core/admin-vite-singleton-modules.js.map +1 -0
  69. package/dist/src/node/core/admin-vite-singleton-modules.mjs +22 -0
  70. package/dist/src/node/core/admin-vite-singleton-modules.mjs.map +1 -0
  71. package/dist/src/node/core/dependencies.js +3 -2
  72. package/dist/src/node/core/dependencies.js.map +1 -1
  73. package/dist/src/node/core/dependencies.mjs +3 -2
  74. package/dist/src/node/core/dependencies.mjs.map +1 -1
  75. package/dist/src/node/core/resolve-module.js +25 -12
  76. package/dist/src/node/core/resolve-module.js.map +1 -1
  77. package/dist/src/node/core/resolve-module.mjs +25 -13
  78. package/dist/src/node/core/resolve-module.mjs.map +1 -1
  79. package/dist/src/node/create-build-context.js +5 -2
  80. package/dist/src/node/create-build-context.js.map +1 -1
  81. package/dist/src/node/create-build-context.mjs +5 -2
  82. package/dist/src/node/create-build-context.mjs.map +1 -1
  83. package/dist/src/node/vite/config.js +13 -1
  84. package/dist/src/node/vite/config.js.map +1 -1
  85. package/dist/src/node/vite/config.mjs +14 -2
  86. package/dist/src/node/vite/config.mjs.map +1 -1
  87. package/dist/src/node/webpack/config.js +5 -0
  88. package/dist/src/node/webpack/config.js.map +1 -1
  89. package/dist/src/node/webpack/config.mjs +5 -0
  90. package/dist/src/node/webpack/config.mjs.map +1 -1
  91. package/package.json +22 -22
@@ -1,7 +1,7 @@
1
1
  import { isObject } from 'lodash/fp';
2
2
  import ora from 'ora';
3
3
  import { engine, strapi } from '@strapi/data-transfer';
4
- import { createStrapiInstance, parseRestoreFromOptions, isIgnoredContentType, formatDiagnostic, getDiffHandler, getAssetsBackupHandler, logTransferFilterSummary, getTransferTelemetryPayload, setSignalHandler, abortTransfer, buildTransferTable, exitMessageText, loadersFactory } from '../../utils/data-transfer.mjs';
4
+ import { normalizeTransferFilterOptions, createStrapiInstance, validateContentTypeTransferOptionsForStrapi, parseRestoreFromOptions, buildTransferTransforms, formatDiagnostic, getDiffHandler, getAssetsBackupHandler, logTransferFilterSummary, getTransferTelemetryPayload, setSignalHandler, abortTransfer, buildTransferTable, exitMessageText, loadersFactory } from '../../utils/data-transfer.mjs';
5
5
  import { exitWith, TRANSFER_PROGRESS_FIELD_SEP, formatElapsedAndMaybeRemainingLabel } from '../../utils/helpers.mjs';
6
6
 
7
7
  const { createTransferEngine } = engine;
@@ -31,7 +31,9 @@ const resolveRemotePullAssetIdleTimeoutMs = (value)=>{
31
31
  if (!(opts.from || opts.to) || opts.from && opts.to) {
32
32
  exitWith(1, 'Exactly one source (from) or destination (to) option must be provided');
33
33
  }
34
+ normalizeTransferFilterOptions(opts);
34
35
  const strapi = await createStrapiInstance();
36
+ validateContentTypeTransferOptionsForStrapi(opts, strapi);
35
37
  const checksumsEnabled = opts.checksums !== false;
36
38
  let source;
37
39
  let destination;
@@ -99,22 +101,7 @@ const resolveRemotePullAssetIdleTimeoutMs = (value)=>{
99
101
  exclude: opts.exclude,
100
102
  only: opts.only,
101
103
  throttle: opts.throttle,
102
- transforms: {
103
- links: [
104
- {
105
- filter (link) {
106
- return !isIgnoredContentType(link.left.type) && !isIgnoredContentType(link.right.type);
107
- }
108
- }
109
- ],
110
- entities: [
111
- {
112
- filter (entity) {
113
- return !isIgnoredContentType(entity.type);
114
- }
115
- }
116
- ]
117
- }
104
+ transforms: buildTransferTransforms(opts)
118
105
  });
119
106
  engine.diagnostics.onDiagnostic(formatDiagnostic('transfer', opts.verbose));
120
107
  const progress = engine.progress.stream;
@@ -204,7 +191,10 @@ const resolveRemotePullAssetIdleTimeoutMs = (value)=>{
204
191
  prepStepDetail = null;
205
192
  logTransferFilterSummary({
206
193
  exclude: opts.exclude,
207
- only: opts.only
194
+ only: opts.only,
195
+ excludeContentTypes: opts.excludeContentTypes,
196
+ onlyContentTypes: opts.onlyContentTypes,
197
+ filesAutoExcluded: opts.filesAutoExcluded
208
198
  });
209
199
  startingSpinner = ora(formatPrepSpinnerLine()).start();
210
200
  startingElapsedInterval = setInterval(()=>{
@@ -1 +1 @@
1
- {"version":3,"file":"action.mjs","sources":["../../../../../src/cli/commands/transfer/action.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport ora from 'ora';\nimport type { Ora } from 'ora';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n createStrapiInstance,\n isIgnoredContentType,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n parseRestoreFromOptions,\n logTransferFilterSummary,\n} from '../../utils/data-transfer';\nimport {\n exitWith,\n formatElapsedAndMaybeRemainingLabel,\n TRANSFER_PROGRESS_FIELD_SEP,\n} from '../../utils/helpers';\n\nconst { createTransferEngine } = engineDataTransfer;\nconst {\n providers: {\n createRemoteStrapiDestinationProvider,\n createLocalStrapiSourceProvider,\n createLocalStrapiDestinationProvider,\n createRemoteStrapiSourceProvider,\n },\n} = strapiDataTransfer;\n\nconst resolveRemotePullAssetIdleTimeoutMs = (value: unknown): number | undefined => {\n if (value == null || value === '') {\n return undefined;\n }\n const n = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return undefined;\n }\n return n;\n};\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 checksums?: boolean;\n}\n/**\n * Transfer command.\n *\n * Transfers data between local Strapi and remote Strapi instances\n */\nexport default async (opts: CmdOptions) => {\n // Avoid DeprecationWarning lines on stderr (e.g. pg `client.query()` while a query is in flight)\n // interleaving with ora spinners during transfer. (Runtime API; not on all @types/node Process typings.)\n (process as NodeJS.Process & { noDeprecation: boolean }).noDeprecation = true;\n\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 const checksumsEnabled = opts.checksums !== false;\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 const assetIdleTimeoutMs = resolveRemotePullAssetIdleTimeoutMs(\n strapi.config.get('server.transfer.remote.assetIdleTimeoutMs')\n );\n\n source = createRemoteStrapiSourceProvider({\n getStrapi: () => strapi,\n url: opts.from,\n auth: {\n type: 'token',\n token: opts.fromToken,\n },\n ...(assetIdleTimeoutMs !== undefined ? { streamTimeout: assetIdleTimeoutMs } : {}),\n ...(checksumsEnabled ? { verifyChecksums: true } : {}),\n });\n }\n\n /** Wired after `engine` exists so destination prep can update the CLI spinner. */\n const transferPhaseBridge: { emit: (message: string) => void } = {\n emit() {\n /* replaced below once `progress` exists */\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, strapi),\n onTransferPhase: (message: string) => transferPhaseBridge.emit(message),\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, strapi),\n onTransferPhase: (message: string) => transferPhaseBridge.emit(message),\n ...(checksumsEnabled ? { verifyChecksums: true } : {}),\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 !isIgnoredContentType(link.left.type) && !isIgnoredContentType(link.right.type);\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !isIgnoredContentType(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 /** Shown until destination prep emits a step; then we keep this prefix and append the step after \" — \". */\n const STARTING_TRANSFER_PREFIX = 'Starting transfer…';\n let prepStepDetail: string | null = null;\n\n const formatPrepSpinnerLine = () =>\n prepStepDetail != null && prepStepDetail !== ''\n ? `${STARTING_TRANSFER_PREFIX} — ${prepStepDetail}`\n : STARTING_TRANSFER_PREFIX;\n\n transferPhaseBridge.emit = (message: string) => {\n prepStepDetail = message;\n progress.emit('transfer::phase', { message: formatPrepSpinnerLine() });\n };\n\n const { updateLoader } = loadersFactory();\n\n let startingSpinner: Ora | null = null;\n let startingElapsedInterval: ReturnType<typeof setInterval> | null = null;\n /** Set when `transfer::start` fires so we can print a final persisted line with elapsed time. */\n let transferPrepStartedAt: number | null = null;\n\n /**\n * Stops the \"starting transfer\" spinner and **leaves a finished line** in the console (like stage\n * `succeed`/`fail`), so the next stage spinner starts on a new line instead of replacing this one.\n */\n const finishStartingSpinner = (outcome: 'done' | 'fail' = 'done') => {\n if (startingElapsedInterval) {\n clearInterval(startingElapsedInterval);\n startingElapsedInterval = null;\n }\n if (startingSpinner) {\n const elapsed = transferPrepStartedAt != null ? Date.now() - transferPrepStartedAt : 0;\n const line = `${formatPrepSpinnerLine()}${TRANSFER_PROGRESS_FIELD_SEP}${formatElapsedAndMaybeRemainingLabel(\n elapsed,\n null\n )}`;\n if (outcome === 'fail') {\n startingSpinner.fail(line);\n } else {\n startingSpinner.succeed(line);\n }\n startingSpinner = null;\n transferPrepStartedAt = null;\n }\n };\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 // Update more frequently to ensure elapsed time is accurate even if the stage is not progressing\n const activeStages = new Set<string>();\n const lastStageData: Record<string, any> = {};\n const interval = setInterval(() => {\n for (const stage of activeStages) {\n if (lastStageData[stage]) {\n // Clone the lastStageData and ensure endTime is undefined so elapsed uses Date.now()\n const dataCopy = { ...lastStageData[stage], endTime: undefined };\n updateLoader(stage as any, { [stage]: dataCopy });\n }\n }\n }, 100);\n\n progress.on(`stage::start`, ({ stage, data }) => {\n finishStartingSpinner('done');\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 lastStageData[stage] = data[stage];\n activeStages.add(stage);\n updateLoader(stage, data);\n });\n\n progress.on('stage::error', ({ stage, data }) => {\n updateLoader(stage, data).fail();\n });\n\n progress.on('transfer::finish', () => {\n finishStartingSpinner('done');\n clearInterval(interval);\n });\n progress.on('transfer::error', () => {\n finishStartingSpinner('fail');\n clearInterval(interval);\n });\n\n progress.on('transfer::start', async () => {\n transferPrepStartedAt = Date.now();\n prepStepDetail = null;\n logTransferFilterSummary({ exclude: opts.exclude, only: opts.only });\n startingSpinner = ora(formatPrepSpinnerLine()).start();\n startingElapsedInterval = setInterval(() => {\n if (startingSpinner && transferPrepStartedAt != null) {\n const elapsed = Date.now() - transferPrepStartedAt;\n startingSpinner.text = `${formatPrepSpinnerLine()}${TRANSFER_PROGRESS_FIELD_SEP}${formatElapsedAndMaybeRemainingLabel(\n elapsed,\n null\n )}`;\n }\n }, 100);\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","resolveRemotePullAssetIdleTimeoutMs","value","undefined","n","Number","isFinite","opts","process","noDeprecation","isObject","exitWith","from","to","strapi","createStrapiInstance","checksumsEnabled","checksums","source","destination","getStrapi","fromToken","assetIdleTimeoutMs","config","get","url","auth","type","token","streamTimeout","verifyChecksums","transferPhaseBridge","emit","strategy","restore","parseRestoreFromOptions","onTransferPhase","message","toToken","engine","versionStrategy","schemaStrategy","exclude","only","throttle","transforms","links","filter","link","isIgnoredContentType","left","right","entities","entity","diagnostics","onDiagnostic","formatDiagnostic","verbose","progress","stream","STARTING_TRANSFER_PREFIX","prepStepDetail","formatPrepSpinnerLine","updateLoader","loadersFactory","startingSpinner","startingElapsedInterval","transferPrepStartedAt","finishStartingSpinner","outcome","clearInterval","elapsed","Date","now","line","TRANSFER_PROGRESS_FIELD_SEP","formatElapsedAndMaybeRemainingLabel","fail","succeed","onSchemaDiff","getDiffHandler","force","action","addErrorHandler","getAssetsBackupHandler","activeStages","Set","lastStageData","interval","setInterval","stage","dataCopy","endTime","on","data","start","add","logTransferFilterSummary","ora","text","telemetry","send","getTransferTelemetryPayload","results","setSignalHandler","abortTransfer","transfer","table","buildTransferTable","console","log","toString","e","error","exitMessageText"],"mappings":"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"}
1
+ {"version":3,"file":"action.mjs","sources":["../../../../../src/cli/commands/transfer/action.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport ora from 'ora';\nimport type { Ora } from 'ora';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n parseRestoreFromOptions,\n buildTransferTransforms,\n normalizeTransferFilterOptions,\n validateContentTypeTransferOptionsForStrapi,\n logTransferFilterSummary,\n} from '../../utils/data-transfer';\nimport {\n exitWith,\n formatElapsedAndMaybeRemainingLabel,\n TRANSFER_PROGRESS_FIELD_SEP,\n} from '../../utils/helpers';\n\nconst { createTransferEngine } = engineDataTransfer;\nconst {\n providers: {\n createRemoteStrapiDestinationProvider,\n createLocalStrapiSourceProvider,\n createLocalStrapiDestinationProvider,\n createRemoteStrapiSourceProvider,\n },\n} = strapiDataTransfer;\n\nconst resolveRemotePullAssetIdleTimeoutMs = (value: unknown): number | undefined => {\n if (value == null || value === '') {\n return undefined;\n }\n const n = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n return undefined;\n }\n return n;\n};\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 excludeContentTypes?: string[];\n onlyContentTypes?: string[];\n filesAutoExcluded?: boolean;\n throttle?: number;\n force?: boolean;\n checksums?: boolean;\n}\n/**\n * Transfer command.\n *\n * Transfers data between local Strapi and remote Strapi instances\n */\nexport default async (opts: CmdOptions) => {\n // Avoid DeprecationWarning lines on stderr (e.g. pg `client.query()` while a query is in flight)\n // interleaving with ora spinners during transfer. (Runtime API; not on all @types/node Process typings.)\n (process as NodeJS.Process & { noDeprecation: boolean }).noDeprecation = true;\n\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 normalizeTransferFilterOptions(opts);\n\n const strapi = await createStrapiInstance();\n validateContentTypeTransferOptionsForStrapi(opts, strapi);\n const checksumsEnabled = opts.checksums !== false;\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 const assetIdleTimeoutMs = resolveRemotePullAssetIdleTimeoutMs(\n strapi.config.get('server.transfer.remote.assetIdleTimeoutMs')\n );\n\n source = createRemoteStrapiSourceProvider({\n getStrapi: () => strapi,\n url: opts.from,\n auth: {\n type: 'token',\n token: opts.fromToken,\n },\n ...(assetIdleTimeoutMs !== undefined ? { streamTimeout: assetIdleTimeoutMs } : {}),\n ...(checksumsEnabled ? { verifyChecksums: true } : {}),\n });\n }\n\n /** Wired after `engine` exists so destination prep can update the CLI spinner. */\n const transferPhaseBridge: { emit: (message: string) => void } = {\n emit() {\n /* replaced below once `progress` exists */\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, strapi),\n onTransferPhase: (message: string) => transferPhaseBridge.emit(message),\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, strapi),\n onTransferPhase: (message: string) => transferPhaseBridge.emit(message),\n ...(checksumsEnabled ? { verifyChecksums: true } : {}),\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: buildTransferTransforms(opts),\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('transfer', opts.verbose));\n\n const progress = engine.progress.stream;\n\n /** Shown until destination prep emits a step; then we keep this prefix and append the step after \" — \". */\n const STARTING_TRANSFER_PREFIX = 'Starting transfer…';\n let prepStepDetail: string | null = null;\n\n const formatPrepSpinnerLine = () =>\n prepStepDetail != null && prepStepDetail !== ''\n ? `${STARTING_TRANSFER_PREFIX} — ${prepStepDetail}`\n : STARTING_TRANSFER_PREFIX;\n\n transferPhaseBridge.emit = (message: string) => {\n prepStepDetail = message;\n progress.emit('transfer::phase', { message: formatPrepSpinnerLine() });\n };\n\n const { updateLoader } = loadersFactory();\n\n let startingSpinner: Ora | null = null;\n let startingElapsedInterval: ReturnType<typeof setInterval> | null = null;\n /** Set when `transfer::start` fires so we can print a final persisted line with elapsed time. */\n let transferPrepStartedAt: number | null = null;\n\n /**\n * Stops the \"starting transfer\" spinner and **leaves a finished line** in the console (like stage\n * `succeed`/`fail`), so the next stage spinner starts on a new line instead of replacing this one.\n */\n const finishStartingSpinner = (outcome: 'done' | 'fail' = 'done') => {\n if (startingElapsedInterval) {\n clearInterval(startingElapsedInterval);\n startingElapsedInterval = null;\n }\n if (startingSpinner) {\n const elapsed = transferPrepStartedAt != null ? Date.now() - transferPrepStartedAt : 0;\n const line = `${formatPrepSpinnerLine()}${TRANSFER_PROGRESS_FIELD_SEP}${formatElapsedAndMaybeRemainingLabel(\n elapsed,\n null\n )}`;\n if (outcome === 'fail') {\n startingSpinner.fail(line);\n } else {\n startingSpinner.succeed(line);\n }\n startingSpinner = null;\n transferPrepStartedAt = null;\n }\n };\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 // Update more frequently to ensure elapsed time is accurate even if the stage is not progressing\n const activeStages = new Set<string>();\n const lastStageData: Record<string, any> = {};\n const interval = setInterval(() => {\n for (const stage of activeStages) {\n if (lastStageData[stage]) {\n // Clone the lastStageData and ensure endTime is undefined so elapsed uses Date.now()\n const dataCopy = { ...lastStageData[stage], endTime: undefined };\n updateLoader(stage as any, { [stage]: dataCopy });\n }\n }\n }, 100);\n\n progress.on(`stage::start`, ({ stage, data }) => {\n finishStartingSpinner('done');\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 lastStageData[stage] = data[stage];\n activeStages.add(stage);\n updateLoader(stage, data);\n });\n\n progress.on('stage::error', ({ stage, data }) => {\n updateLoader(stage, data).fail();\n });\n\n progress.on('transfer::finish', () => {\n finishStartingSpinner('done');\n clearInterval(interval);\n });\n progress.on('transfer::error', () => {\n finishStartingSpinner('fail');\n clearInterval(interval);\n });\n\n progress.on('transfer::start', async () => {\n transferPrepStartedAt = Date.now();\n prepStepDetail = null;\n logTransferFilterSummary({\n exclude: opts.exclude,\n only: opts.only,\n excludeContentTypes: opts.excludeContentTypes,\n onlyContentTypes: opts.onlyContentTypes,\n filesAutoExcluded: opts.filesAutoExcluded,\n });\n startingSpinner = ora(formatPrepSpinnerLine()).start();\n startingElapsedInterval = setInterval(() => {\n if (startingSpinner && transferPrepStartedAt != null) {\n const elapsed = Date.now() - transferPrepStartedAt;\n startingSpinner.text = `${formatPrepSpinnerLine()}${TRANSFER_PROGRESS_FIELD_SEP}${formatElapsedAndMaybeRemainingLabel(\n elapsed,\n null\n )}`;\n }\n }, 100);\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","resolveRemotePullAssetIdleTimeoutMs","value","undefined","n","Number","isFinite","opts","process","noDeprecation","isObject","exitWith","from","to","normalizeTransferFilterOptions","strapi","createStrapiInstance","validateContentTypeTransferOptionsForStrapi","checksumsEnabled","checksums","source","destination","getStrapi","fromToken","assetIdleTimeoutMs","config","get","url","auth","type","token","streamTimeout","verifyChecksums","transferPhaseBridge","emit","strategy","restore","parseRestoreFromOptions","onTransferPhase","message","toToken","engine","versionStrategy","schemaStrategy","exclude","only","throttle","transforms","buildTransferTransforms","diagnostics","onDiagnostic","formatDiagnostic","verbose","progress","stream","STARTING_TRANSFER_PREFIX","prepStepDetail","formatPrepSpinnerLine","updateLoader","loadersFactory","startingSpinner","startingElapsedInterval","transferPrepStartedAt","finishStartingSpinner","outcome","clearInterval","elapsed","Date","now","line","TRANSFER_PROGRESS_FIELD_SEP","formatElapsedAndMaybeRemainingLabel","fail","succeed","onSchemaDiff","getDiffHandler","force","action","addErrorHandler","getAssetsBackupHandler","activeStages","Set","lastStageData","interval","setInterval","stage","dataCopy","endTime","on","data","start","add","logTransferFilterSummary","excludeContentTypes","onlyContentTypes","filesAutoExcluded","ora","text","telemetry","send","getTransferTelemetryPayload","results","setSignalHandler","abortTransfer","transfer","table","buildTransferTable","console","log","toString","e","error","exitMessageText"],"mappings":"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"}
@@ -10,7 +10,7 @@ var action = require('./action.js');
10
10
  /**
11
11
  * `$ strapi transfer`
12
12
  */ const command = ()=>{
13
- return commander.createCommand('transfer').description('Transfer data from one source to another').allowExcessArguments(false).addOption(new commander.Option('--from <sourceURL>', `URL of the remote Strapi instance to get data from`).argParser(commander$1.parseURL)).addOption(new commander.Option('--from-token <token>', `Transfer token for the remote Strapi source`)).addOption(new commander.Option('--to <destinationURL>', `URL of the remote Strapi instance to send data to`).argParser(commander$1.parseURL)).addOption(new commander.Option('--to-token <token>', `Transfer token for the remote Strapi destination`)).addOption(new commander.Option('--no-checksums', 'Disable end-to-end asset checksum verification for assets transfer')).addOption(new commander.Option('--verbose', 'Enable verbose logs')).addOption(commander$1.forceOption).addOption(dataTransfer.excludeOption).addOption(dataTransfer.onlyOption).addOption(dataTransfer.throttleOption).hook('preAction', dataTransfer.validateExcludeOnly).hook('preAction', helpers.ifOptions(async (opts)=>opts.from && opts.to || opts.from && opts.toToken || opts.to && opts.fromToken, async ()=>helpers.exitWith(1, 'Only one remote source (from) or destination (to) option may be provided'))).hook('preAction', helpers.ifOptions(// Only run interactive prompts if neither --from nor --to is provided
13
+ return commander.createCommand('transfer').description('Transfer data from one source to another').allowExcessArguments(false).addOption(new commander.Option('--from <sourceURL>', `URL of the remote Strapi instance to get data from`).argParser(commander$1.parseURL)).addOption(new commander.Option('--from-token <token>', `Transfer token for the remote Strapi source`)).addOption(new commander.Option('--to <destinationURL>', `URL of the remote Strapi instance to send data to`).argParser(commander$1.parseURL)).addOption(new commander.Option('--to-token <token>', `Transfer token for the remote Strapi destination`)).addOption(new commander.Option('--no-checksums', 'Disable end-to-end asset checksum verification for assets transfer')).addOption(new commander.Option('--verbose', 'Enable verbose logs')).addOption(commander$1.forceOption).addOption(dataTransfer.excludeOption).addOption(dataTransfer.onlyOption).addOption(dataTransfer.excludeContentTypesOption).addOption(dataTransfer.onlyContentTypesOption).addOption(dataTransfer.throttleOption).hook('preAction', dataTransfer.normalizeTransferFilterOptionsHook).hook('preAction', dataTransfer.validateExcludeOnly).hook('preAction', dataTransfer.validateContentTypeTransferOptions).hook('preAction', helpers.ifOptions(async (opts)=>opts.from && opts.to || opts.from && opts.toToken || opts.to && opts.fromToken, async ()=>helpers.exitWith(1, 'Only one remote source (from) or destination (to) option may be provided'))).hook('preAction', helpers.ifOptions(// Only run interactive prompts if neither --from nor --to is provided
14
14
  async (opts)=>!opts.from && !opts.to, async (thisCommand)=>{
15
15
  const opts = thisCommand.opts();
16
16
  const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sources":["../../../../../src/cli/commands/transfer/command.ts"],"sourcesContent":["import { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { getInquirer } from '../../utils/get-inquirer';\nimport { exitWith, assertUrlHasProtocol, ifOptions } from '../../utils/helpers';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\n\nimport action from './action';\n\n/**\n * `$ strapi transfer`\n */\nconst command = () => {\n return (\n createCommand('transfer')\n .description('Transfer data from one source to another')\n .allowExcessArguments(false)\n .addOption(\n new Option(\n '--from <sourceURL>',\n `URL of the remote Strapi instance to get data from`\n ).argParser(parseURL)\n )\n .addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`))\n .addOption(\n new Option(\n '--to <destinationURL>',\n `URL of the remote Strapi instance to send data to`\n ).argParser(parseURL)\n )\n\n .addOption(\n new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)\n )\n .addOption(\n new Option(\n '--no-checksums',\n 'Disable end-to-end asset checksum verification for assets transfer'\n )\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook(\n 'preAction',\n ifOptions(\n async (opts) =>\n (opts.from && opts.to) || (opts.from && opts.toToken) || (opts.to && opts.fromToken),\n async () =>\n exitWith(1, 'Only one remote source (from) or destination (to) option may be provided')\n )\n )\n .hook(\n 'preAction',\n ifOptions(\n // Only run interactive prompts if neither --from nor --to is provided\n async (opts) => !opts.from && !opts.to,\n async (thisCommand) => {\n const opts = thisCommand.opts();\n const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;\n const hasEnvToken = process.env.STRAPI_TRANSFER_TOKEN;\n\n const logDocumentation = () => {\n console.info(\n 'ℹ️ Data transfer documentation: https://docs.strapi.io/dev-docs/data-management/transfer'\n );\n };\n\n const logEnvironmentVariables = () => {\n if (!hasEnvUrl && !hasEnvToken) {\n console.info('ℹ️ No transfer configuration found in environment variables');\n console.info(\n ' → Add STRAPI_TRANSFER_URL and STRAPI_TRANSFER_TOKEN environment variables to make the transfer process faster for future runs'\n );\n return;\n }\n\n console.info('ℹ️ Found transfer configuration in your environment:');\n\n if (hasEnvUrl) {\n console.info(\n ` → Environment STRAPI_TRANSFER_URL (${hasEnvUrl}) will be used as the transfer URL`\n );\n }\n\n if (hasEnvToken) {\n console.info(\n ' → Environment STRAPI_TRANSFER_TOKEN value will be used as the transfer token'\n );\n }\n\n console.info(); // Empty line for better readability\n };\n\n const determineDirection = async () => {\n // If user has not provided a direction from CLI, log the documentation\n if (!opts.from && !opts.to) {\n logDocumentation();\n }\n\n logEnvironmentVariables();\n\n if (opts.from) {\n return 'from';\n }\n if (opts.to) {\n return 'to';\n }\n\n const inquirer = await getInquirer();\n const { dir } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dir',\n message: 'Choose transfer direction:',\n choices: [\n { name: 'Pull data from remote Strapi to local', value: 'from' },\n { name: 'Push local data to remote Strapi', value: 'to' },\n ],\n },\n ]);\n\n return dir;\n };\n\n const determineUrl = async (direction: 'from' | 'to') => {\n if (opts[direction]) {\n return new URL(opts[direction]);\n }\n\n if (process.env.STRAPI_TRANSFER_URL) {\n return new URL(process.env.STRAPI_TRANSFER_URL);\n }\n\n const inquirer = await getInquirer();\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'remoteUrl',\n message: `Enter the URL of the remote Strapi instance to ${direction === 'from' ? 'get data from' : 'send data to'}:`,\n default: process.env.STRAPI_TRANSFER_URL,\n validate(input: string) {\n try {\n const url = new URL(input);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return 'URL must use http: or https: protocol';\n }\n return true;\n } catch (error) {\n return 'Please enter a valid URL (e.g., http://localhost:1337/admin or https://example.com/admin)';\n }\n },\n },\n ]);\n\n return new URL(answer.remoteUrl);\n };\n\n const determineToken = async (direction: 'from' | 'to') => {\n if (opts[`${direction}Token`]) {\n return opts[`${direction}Token`];\n }\n\n if (process.env.STRAPI_TRANSFER_TOKEN) {\n return process.env.STRAPI_TRANSFER_TOKEN;\n }\n\n const inquirer = await getInquirer();\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: `Enter the transfer token for the remote Strapi ${direction === 'from' ? 'source' : 'destination'}:`,\n default: process.env.STRAPI_TRANSFER_TOKEN,\n validate(input: string) {\n if (!input?.length) {\n return 'Transfer token is required';\n }\n return true;\n },\n },\n ]);\n\n return answer.token;\n };\n\n const direction = await determineDirection();\n opts[direction] = await determineUrl(direction);\n opts[`${direction}Token`] = await determineToken(direction);\n }\n )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi source',\n name: 'fromToken',\n },\n ]);\n if (!answers.fromToken?.length) {\n exitWith(1, 'No token provided for remote source, aborting transfer.');\n }\n thisCommand.opts().fromToken = answers.fromToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete all the local Strapi assets and its database. Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n // If --to is used, validate the URL, token, and confirm restore\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi destination',\n name: 'toToken',\n },\n ]);\n if (!answers.toToken?.length) {\n exitWith(1, 'No token provided for remote destination, aborting transfer.');\n }\n thisCommand.opts().toToken = answers.toToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete existing data from the remote Strapi! Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["command","createCommand","description","allowExcessArguments","addOption","Option","argParser","parseURL","forceOption","excludeOption","onlyOption","throttleOption","hook","validateExcludeOnly","ifOptions","opts","from","to","toToken","fromToken","exitWith","thisCommand","hasEnvUrl","process","env","STRAPI_TRANSFER_URL","hasEnvToken","STRAPI_TRANSFER_TOKEN","logDocumentation","console","info","logEnvironmentVariables","determineDirection","inquirer","getInquirer","dir","prompt","type","name","message","choices","value","determineUrl","direction","URL","answer","default","validate","input","url","includes","protocol","error","remoteUrl","determineToken","length","token","assertUrlHasProtocol","answers","getCommanderConfirmMessage","failMessage","action"],"mappings":";;;;;;;;;AAaA;;AAEC,UACKA,OAAAA,GAAU,IAAA;IACd,OACEC,uBAAAA,CAAc,UAAA,CAAA,CACXC,WAAW,CAAC,0CAAA,CAAA,CACZC,oBAAoB,CAAC,KAAA,CAAA,CACrBC,SAAS,CACR,IAAIC,gBAAAA,CACF,sBACA,CAAC,kDAAkD,CAAC,CAAA,CACpDC,SAAS,CAACC,uBAEbH,SAAS,CAAC,IAAIC,gBAAAA,CAAO,sBAAA,EAAwB,CAAC,2CAA2C,CAAC,CAAA,CAAA,CAC1FD,SAAS,CACR,IAAIC,gBAAAA,CACF,yBACA,CAAC,iDAAiD,CAAC,CAAA,CACnDC,SAAS,CAACC,uBAGbH,SAAS,CACR,IAAIC,gBAAAA,CAAO,oBAAA,EAAsB,CAAC,gDAAgD,CAAC,CAAA,CAAA,CAEpFD,SAAS,CACR,IAAIC,gBAAAA,CACF,gBAAA,EACA,uEAGHD,SAAS,CAAC,IAAIC,gBAAAA,CAAO,WAAA,EAAa,qBAAA,CAAA,CAAA,CAClCD,SAAS,CAACI,uBAAAA,CAAAA,CACVJ,SAAS,CAACK,0BAAAA,CAAAA,CACVL,SAAS,CAACM,uBAAAA,CAAAA,CACVN,SAAS,CAACO,2BAAAA,CAAAA,CACVC,IAAI,CAAC,WAAA,EAAaC,gCAAAA,CAAAA,CAClBD,IAAI,CACH,WAAA,EACAE,iBAAAA,CACE,OAAOC,IAAAA,GACL,IAACA,CAAKC,IAAI,IAAID,IAAAA,CAAKE,EAAE,IAAMF,KAAKC,IAAI,IAAID,IAAAA,CAAKG,OAAO,IAAMH,IAAAA,CAAKE,EAAE,IAAIF,IAAAA,CAAKI,SAAS,EACrF,UACEC,gBAAAA,CAAS,CAAA,EAAG,0EAAA,CAAA,CAAA,CAAA,CAGjBR,IAAI,CACH,WAAA,EACAE,iBAAAA;IAEE,OAAOC,IAAAA,GAAS,CAACA,IAAAA,CAAKC,IAAI,IAAI,CAACD,IAAAA,CAAKE,EAAE,EACtC,OAAOI,WAAAA,GAAAA;QACL,MAAMN,IAAAA,GAAOM,YAAYN,IAAI,EAAA;AAC7B,QAAA,MAAMO,SAAAA,GAAYC,OAAAA,CAAQC,GAAG,CAACC,mBAAmB;AACjD,QAAA,MAAMC,WAAAA,GAAcH,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAErD,QAAA,MAAMC,gBAAAA,GAAmB,IAAA;AACvBC,YAAAA,OAAAA,CAAQC,IAAI,CACV,2FAAA,CAAA;AAEJ,QAAA,CAAA;AAEA,QAAA,MAAMC,uBAAAA,GAA0B,IAAA;YAC9B,IAAI,CAACT,SAAAA,IAAa,CAACI,WAAAA,EAAa;AAC9BG,gBAAAA,OAAAA,CAAQC,IAAI,CAAC,8DAAA,CAAA;AACbD,gBAAAA,OAAAA,CAAQC,IAAI,CACV,kIAAA,CAAA;AAEF,gBAAA;AACF,YAAA;AAEAD,YAAAA,OAAAA,CAAQC,IAAI,CAAC,uDAAA,CAAA;AAEb,YAAA,IAAIR,SAAAA,EAAW;AACbO,gBAAAA,OAAAA,CAAQC,IAAI,CACV,CAAC,sCAAsC,EAAER,SAAAA,CAAU,kCAAkC,CAAC,CAAA;AAE1F,YAAA;AAEA,YAAA,IAAII,WAAAA,EAAa;AACfG,gBAAAA,OAAAA,CAAQC,IAAI,CACV,iFAAA,CAAA;AAEJ,YAAA;YAEAD,OAAAA,CAAQC,IAAI;AACd,QAAA,CAAA;AAEA,QAAA,MAAME,kBAAAA,GAAqB,UAAA;;AAEzB,YAAA,IAAI,CAACjB,IAAAA,CAAKC,IAAI,IAAI,CAACD,IAAAA,CAAKE,EAAE,EAAE;AAC1BW,gBAAAA,gBAAAA,EAAAA;AACF,YAAA;AAEAG,YAAAA,uBAAAA,EAAAA;YAEA,IAAIhB,IAAAA,CAAKC,IAAI,EAAE;gBACb,OAAO,MAAA;AACT,YAAA;YACA,IAAID,IAAAA,CAAKE,EAAE,EAAE;gBACX,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAMgB,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAMF,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,MAAA;oBACNC,IAAAA,EAAM,KAAA;oBACNC,OAAAA,EAAS,4BAAA;oBACTC,OAAAA,EAAS;AACP,wBAAA;4BAAEF,IAAAA,EAAM,uCAAA;4BAAyCG,KAAAA,EAAO;AAAO,yBAAA;AAC/D,wBAAA;4BAAEH,IAAAA,EAAM,kCAAA;4BAAoCG,KAAAA,EAAO;AAAK;AACzD;AACH;AACD,aAAA,CAAA;YAED,OAAON,GAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMO,eAAe,OAAOC,SAAAA,GAAAA;YAC1B,IAAI5B,IAAI,CAAC4B,SAAAA,CAAU,EAAE;AACnB,gBAAA,OAAO,IAAIC,GAAAA,CAAI7B,IAAI,CAAC4B,SAAAA,CAAU,CAAA;AAChC,YAAA;AAEA,YAAA,IAAIpB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB,EAAE;AACnC,gBAAA,OAAO,IAAImB,GAAAA,CAAIrB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB,CAAA;AAChD,YAAA;AAEA,YAAA,MAAMQ,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAMW,MAAAA,GAAS,MAAMZ,QAAAA,CAASG,MAAM,CAAC;AACnC,gBAAA;oBACEC,IAAAA,EAAM,OAAA;oBACNC,IAAAA,EAAM,WAAA;oBACNC,OAAAA,EAAS,CAAC,+CAA+C,EAAEI,SAAAA,KAAc,SAAS,eAAA,GAAkB,cAAA,CAAe,CAAC,CAAC;oBACrHG,OAAAA,EAASvB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB;AACxCsB,oBAAAA,QAAAA,CAAAA,CAASC,KAAa,EAAA;wBACpB,IAAI;4BACF,MAAMC,GAAAA,GAAM,IAAIL,GAAAA,CAAII,KAAAA,CAAAA;AACpB,4BAAA,IAAI,CAAC;AAAC,gCAAA,OAAA;AAAS,gCAAA;AAAS,6BAAA,CAACE,QAAQ,CAACD,GAAAA,CAAIE,QAAQ,CAAA,EAAG;gCAC/C,OAAO,uCAAA;AACT,4BAAA;4BACA,OAAO,IAAA;AACT,wBAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;4BACd,OAAO,2FAAA;AACT,wBAAA;AACF,oBAAA;AACF;AACD,aAAA,CAAA;YAED,OAAO,IAAIR,GAAAA,CAAIC,MAAAA,CAAOQ,SAAS,CAAA;AACjC,QAAA,CAAA;AAEA,QAAA,MAAMC,iBAAiB,OAAOX,SAAAA,GAAAA;AAC5B,YAAA,IAAI5B,IAAI,CAAC,CAAA,EAAG4B,UAAU,KAAK,CAAC,CAAC,EAAE;AAC7B,gBAAA,OAAO5B,IAAI,CAAC,CAAA,EAAG4B,SAAAA,CAAU,KAAK,CAAC,CAAC;AAClC,YAAA;AAEA,YAAA,IAAIpB,OAAAA,CAAQC,GAAG,CAACG,qBAAqB,EAAE;gBACrC,OAAOJ,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAC1C,YAAA;AAEA,YAAA,MAAMM,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAMW,MAAAA,GAAS,MAAMZ,QAAAA,CAASG,MAAM,CAAC;AACnC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNC,IAAAA,EAAM,OAAA;oBACNC,OAAAA,EAAS,CAAC,+CAA+C,EAAEI,SAAAA,KAAc,SAAS,QAAA,GAAW,aAAA,CAAc,CAAC,CAAC;oBAC7GG,OAAAA,EAASvB,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAC1CoB,oBAAAA,QAAAA,CAAAA,CAASC,KAAa,EAAA;wBACpB,IAAI,CAACA,OAAOO,MAAAA,EAAQ;4BAClB,OAAO,4BAAA;AACT,wBAAA;wBACA,OAAO,IAAA;AACT,oBAAA;AACF;AACD,aAAA,CAAA;AAED,YAAA,OAAOV,OAAOW,KAAK;AACrB,QAAA,CAAA;AAEA,QAAA,MAAMb,YAAY,MAAMX,kBAAAA,EAAAA;AACxBjB,QAAAA,IAAI,CAAC4B,SAAAA,CAAU,GAAG,MAAMD,YAAAA,CAAaC,SAAAA,CAAAA;QACrC5B,IAAI,CAAC,GAAG4B,SAAAA,CAAU,KAAK,CAAC,CAAC,GAAG,MAAMW,cAAAA,CAAeX,SAAAA,CAAAA;AACnD,IAAA,CAAA,CAAA,CAGJ;KACC/B,IAAI,CACH,aACAE,iBAAAA,CACE,OAAOC,OAASA,IAAAA,CAAKC,IAAI,EACzB,OAAOK,WAAAA,GAAAA;AACLoC,QAAAA,4BAAAA,CAAqBpC,WAAAA,CAAYN,IAAI,EAAA,CAAGC,IAAI,EAAE;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA,CAAA;AACjE,QAAA,IAAI,CAACK,WAAAA,CAAYN,IAAI,EAAA,CAAGI,SAAS,EAAE;AACjC,YAAA,MAAMc,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAMwB,OAAAA,GAAU,MAAMzB,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNE,OAAAA,EAAS,+DAAA;oBACTD,IAAAA,EAAM;AACR;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACoB,OAAAA,CAAQvC,SAAS,EAAEoC,MAAAA,EAAQ;AAC9BnC,gBAAAA,gBAAAA,CAAS,CAAA,EAAG,yDAAA,CAAA;AACd,YAAA;AACAC,YAAAA,WAAAA,CAAYN,IAAI,EAAA,CAAGI,SAAS,GAAGuC,QAAQvC,SAAS;AAClD,QAAA;AAEA,QAAA,MAAMwC,uCACJ,0GAAA,EACA;YAAEC,WAAAA,EAAa;SAA2B,CAAA,CAC1CvC,WAAAA,CAAAA;AACJ,IAAA,CAAA,CAAA,CAGJ;KACCT,IAAI,CACH,aACAE,iBAAAA,CACE,OAAOC,OAASA,IAAAA,CAAKE,EAAE,EACvB,OAAOI,WAAAA,GAAAA;AACLoC,QAAAA,4BAAAA,CAAqBpC,WAAAA,CAAYN,IAAI,EAAA,CAAGE,EAAE,EAAE;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA,CAAA;AAC/D,QAAA,IAAI,CAACI,WAAAA,CAAYN,IAAI,EAAA,CAAGG,OAAO,EAAE;AAC/B,YAAA,MAAMe,WAAW,MAAMC,uBAAAA,EAAAA;AACvB,YAAA,MAAMwB,OAAAA,GAAU,MAAMzB,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNE,OAAAA,EAAS,oEAAA;oBACTD,IAAAA,EAAM;AACR;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACoB,OAAAA,CAAQxC,OAAO,EAAEqC,MAAAA,EAAQ;AAC5BnC,gBAAAA,gBAAAA,CAAS,CAAA,EAAG,8DAAA,CAAA;AACd,YAAA;AACAC,YAAAA,WAAAA,CAAYN,IAAI,EAAA,CAAGG,OAAO,GAAGwC,QAAQxC,OAAO;AAC9C,QAAA;AAEA,QAAA,MAAMyC,uCACJ,kGAAA,EACA;YAAEC,WAAAA,EAAa;SAA2B,CAAA,CAC1CvC,WAAAA,CAAAA;AACJ,IAAA,CAAA,CAAA,CAAA,CAGHwC,MAAM,CAACA,MAAAA,CAAAA;AAEd;;;;"}
1
+ {"version":3,"file":"command.js","sources":["../../../../../src/cli/commands/transfer/command.ts"],"sourcesContent":["import { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { getInquirer } from '../../utils/get-inquirer';\nimport { exitWith, assertUrlHasProtocol, ifOptions } from '../../utils/helpers';\nimport {\n excludeOption,\n onlyOption,\n excludeContentTypesOption,\n onlyContentTypesOption,\n throttleOption,\n validateExcludeOnly,\n validateContentTypeTransferOptions,\n normalizeTransferFilterOptionsHook,\n} from '../../utils/data-transfer';\n\nimport action from './action';\n\n/**\n * `$ strapi transfer`\n */\nconst command = () => {\n return (\n createCommand('transfer')\n .description('Transfer data from one source to another')\n .allowExcessArguments(false)\n .addOption(\n new Option(\n '--from <sourceURL>',\n `URL of the remote Strapi instance to get data from`\n ).argParser(parseURL)\n )\n .addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`))\n .addOption(\n new Option(\n '--to <destinationURL>',\n `URL of the remote Strapi instance to send data to`\n ).argParser(parseURL)\n )\n\n .addOption(\n new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)\n )\n .addOption(\n new Option(\n '--no-checksums',\n 'Disable end-to-end asset checksum verification for assets transfer'\n )\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(excludeContentTypesOption)\n .addOption(onlyContentTypesOption)\n .addOption(throttleOption)\n .hook('preAction', normalizeTransferFilterOptionsHook)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', validateContentTypeTransferOptions)\n .hook(\n 'preAction',\n ifOptions(\n async (opts) =>\n (opts.from && opts.to) || (opts.from && opts.toToken) || (opts.to && opts.fromToken),\n async () =>\n exitWith(1, 'Only one remote source (from) or destination (to) option may be provided')\n )\n )\n .hook(\n 'preAction',\n ifOptions(\n // Only run interactive prompts if neither --from nor --to is provided\n async (opts) => !opts.from && !opts.to,\n async (thisCommand) => {\n const opts = thisCommand.opts();\n const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;\n const hasEnvToken = process.env.STRAPI_TRANSFER_TOKEN;\n\n const logDocumentation = () => {\n console.info(\n 'ℹ️ Data transfer documentation: https://docs.strapi.io/dev-docs/data-management/transfer'\n );\n };\n\n const logEnvironmentVariables = () => {\n if (!hasEnvUrl && !hasEnvToken) {\n console.info('ℹ️ No transfer configuration found in environment variables');\n console.info(\n ' → Add STRAPI_TRANSFER_URL and STRAPI_TRANSFER_TOKEN environment variables to make the transfer process faster for future runs'\n );\n return;\n }\n\n console.info('ℹ️ Found transfer configuration in your environment:');\n\n if (hasEnvUrl) {\n console.info(\n ` → Environment STRAPI_TRANSFER_URL (${hasEnvUrl}) will be used as the transfer URL`\n );\n }\n\n if (hasEnvToken) {\n console.info(\n ' → Environment STRAPI_TRANSFER_TOKEN value will be used as the transfer token'\n );\n }\n\n console.info(); // Empty line for better readability\n };\n\n const determineDirection = async () => {\n // If user has not provided a direction from CLI, log the documentation\n if (!opts.from && !opts.to) {\n logDocumentation();\n }\n\n logEnvironmentVariables();\n\n if (opts.from) {\n return 'from';\n }\n if (opts.to) {\n return 'to';\n }\n\n const inquirer = await getInquirer();\n const { dir } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dir',\n message: 'Choose transfer direction:',\n choices: [\n { name: 'Pull data from remote Strapi to local', value: 'from' },\n { name: 'Push local data to remote Strapi', value: 'to' },\n ],\n },\n ]);\n\n return dir;\n };\n\n const determineUrl = async (direction: 'from' | 'to') => {\n if (opts[direction]) {\n return new URL(opts[direction]);\n }\n\n if (process.env.STRAPI_TRANSFER_URL) {\n return new URL(process.env.STRAPI_TRANSFER_URL);\n }\n\n const inquirer = await getInquirer();\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'remoteUrl',\n message: `Enter the URL of the remote Strapi instance to ${direction === 'from' ? 'get data from' : 'send data to'}:`,\n default: process.env.STRAPI_TRANSFER_URL,\n validate(input: string) {\n try {\n const url = new URL(input);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return 'URL must use http: or https: protocol';\n }\n return true;\n } catch (error) {\n return 'Please enter a valid URL (e.g., http://localhost:1337/admin or https://example.com/admin)';\n }\n },\n },\n ]);\n\n return new URL(answer.remoteUrl);\n };\n\n const determineToken = async (direction: 'from' | 'to') => {\n if (opts[`${direction}Token`]) {\n return opts[`${direction}Token`];\n }\n\n if (process.env.STRAPI_TRANSFER_TOKEN) {\n return process.env.STRAPI_TRANSFER_TOKEN;\n }\n\n const inquirer = await getInquirer();\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: `Enter the transfer token for the remote Strapi ${direction === 'from' ? 'source' : 'destination'}:`,\n default: process.env.STRAPI_TRANSFER_TOKEN,\n validate(input: string) {\n if (!input?.length) {\n return 'Transfer token is required';\n }\n return true;\n },\n },\n ]);\n\n return answer.token;\n };\n\n const direction = await determineDirection();\n opts[direction] = await determineUrl(direction);\n opts[`${direction}Token`] = await determineToken(direction);\n }\n )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi source',\n name: 'fromToken',\n },\n ]);\n if (!answers.fromToken?.length) {\n exitWith(1, 'No token provided for remote source, aborting transfer.');\n }\n thisCommand.opts().fromToken = answers.fromToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete all the local Strapi assets and its database. Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n // If --to is used, validate the URL, token, and confirm restore\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi destination',\n name: 'toToken',\n },\n ]);\n if (!answers.toToken?.length) {\n exitWith(1, 'No token provided for remote destination, aborting transfer.');\n }\n thisCommand.opts().toToken = answers.toToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete existing data from the remote Strapi! Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["command","createCommand","description","allowExcessArguments","addOption","Option","argParser","parseURL","forceOption","excludeOption","onlyOption","excludeContentTypesOption","onlyContentTypesOption","throttleOption","hook","normalizeTransferFilterOptionsHook","validateExcludeOnly","validateContentTypeTransferOptions","ifOptions","opts","from","to","toToken","fromToken","exitWith","thisCommand","hasEnvUrl","process","env","STRAPI_TRANSFER_URL","hasEnvToken","STRAPI_TRANSFER_TOKEN","logDocumentation","console","info","logEnvironmentVariables","determineDirection","inquirer","getInquirer","dir","prompt","type","name","message","choices","value","determineUrl","direction","URL","answer","default","validate","input","url","includes","protocol","error","remoteUrl","determineToken","length","token","assertUrlHasProtocol","answers","getCommanderConfirmMessage","failMessage","action"],"mappings":"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"}
@@ -2,13 +2,13 @@ import { createCommand, Option } from 'commander';
2
2
  import { parseURL, forceOption, getCommanderConfirmMessage } from '../../utils/commander.mjs';
3
3
  import { getInquirer } from '../../utils/get-inquirer.mjs';
4
4
  import { ifOptions, exitWith, assertUrlHasProtocol } from '../../utils/helpers.mjs';
5
- import { excludeOption, onlyOption, throttleOption, validateExcludeOnly } from '../../utils/data-transfer.mjs';
5
+ import { excludeOption, onlyOption, excludeContentTypesOption, onlyContentTypesOption, throttleOption, normalizeTransferFilterOptionsHook, validateExcludeOnly, validateContentTypeTransferOptions } from '../../utils/data-transfer.mjs';
6
6
  import action from './action.mjs';
7
7
 
8
8
  /**
9
9
  * `$ strapi transfer`
10
10
  */ const command = ()=>{
11
- return createCommand('transfer').description('Transfer data from one source to another').allowExcessArguments(false).addOption(new Option('--from <sourceURL>', `URL of the remote Strapi instance to get data from`).argParser(parseURL)).addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`)).addOption(new Option('--to <destinationURL>', `URL of the remote Strapi instance to send data to`).argParser(parseURL)).addOption(new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)).addOption(new Option('--no-checksums', 'Disable end-to-end asset checksum verification for assets transfer')).addOption(new Option('--verbose', 'Enable verbose logs')).addOption(forceOption).addOption(excludeOption).addOption(onlyOption).addOption(throttleOption).hook('preAction', validateExcludeOnly).hook('preAction', ifOptions(async (opts)=>opts.from && opts.to || opts.from && opts.toToken || opts.to && opts.fromToken, async ()=>exitWith(1, 'Only one remote source (from) or destination (to) option may be provided'))).hook('preAction', ifOptions(// Only run interactive prompts if neither --from nor --to is provided
11
+ return createCommand('transfer').description('Transfer data from one source to another').allowExcessArguments(false).addOption(new Option('--from <sourceURL>', `URL of the remote Strapi instance to get data from`).argParser(parseURL)).addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`)).addOption(new Option('--to <destinationURL>', `URL of the remote Strapi instance to send data to`).argParser(parseURL)).addOption(new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)).addOption(new Option('--no-checksums', 'Disable end-to-end asset checksum verification for assets transfer')).addOption(new Option('--verbose', 'Enable verbose logs')).addOption(forceOption).addOption(excludeOption).addOption(onlyOption).addOption(excludeContentTypesOption).addOption(onlyContentTypesOption).addOption(throttleOption).hook('preAction', normalizeTransferFilterOptionsHook).hook('preAction', validateExcludeOnly).hook('preAction', validateContentTypeTransferOptions).hook('preAction', ifOptions(async (opts)=>opts.from && opts.to || opts.from && opts.toToken || opts.to && opts.fromToken, async ()=>exitWith(1, 'Only one remote source (from) or destination (to) option may be provided'))).hook('preAction', ifOptions(// Only run interactive prompts if neither --from nor --to is provided
12
12
  async (opts)=>!opts.from && !opts.to, async (thisCommand)=>{
13
13
  const opts = thisCommand.opts();
14
14
  const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;
@@ -1 +1 @@
1
- {"version":3,"file":"command.mjs","sources":["../../../../../src/cli/commands/transfer/command.ts"],"sourcesContent":["import { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { getInquirer } from '../../utils/get-inquirer';\nimport { exitWith, assertUrlHasProtocol, ifOptions } from '../../utils/helpers';\nimport {\n excludeOption,\n onlyOption,\n throttleOption,\n validateExcludeOnly,\n} from '../../utils/data-transfer';\n\nimport action from './action';\n\n/**\n * `$ strapi transfer`\n */\nconst command = () => {\n return (\n createCommand('transfer')\n .description('Transfer data from one source to another')\n .allowExcessArguments(false)\n .addOption(\n new Option(\n '--from <sourceURL>',\n `URL of the remote Strapi instance to get data from`\n ).argParser(parseURL)\n )\n .addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`))\n .addOption(\n new Option(\n '--to <destinationURL>',\n `URL of the remote Strapi instance to send data to`\n ).argParser(parseURL)\n )\n\n .addOption(\n new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)\n )\n .addOption(\n new Option(\n '--no-checksums',\n 'Disable end-to-end asset checksum verification for assets transfer'\n )\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(throttleOption)\n .hook('preAction', validateExcludeOnly)\n .hook(\n 'preAction',\n ifOptions(\n async (opts) =>\n (opts.from && opts.to) || (opts.from && opts.toToken) || (opts.to && opts.fromToken),\n async () =>\n exitWith(1, 'Only one remote source (from) or destination (to) option may be provided')\n )\n )\n .hook(\n 'preAction',\n ifOptions(\n // Only run interactive prompts if neither --from nor --to is provided\n async (opts) => !opts.from && !opts.to,\n async (thisCommand) => {\n const opts = thisCommand.opts();\n const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;\n const hasEnvToken = process.env.STRAPI_TRANSFER_TOKEN;\n\n const logDocumentation = () => {\n console.info(\n 'ℹ️ Data transfer documentation: https://docs.strapi.io/dev-docs/data-management/transfer'\n );\n };\n\n const logEnvironmentVariables = () => {\n if (!hasEnvUrl && !hasEnvToken) {\n console.info('ℹ️ No transfer configuration found in environment variables');\n console.info(\n ' → Add STRAPI_TRANSFER_URL and STRAPI_TRANSFER_TOKEN environment variables to make the transfer process faster for future runs'\n );\n return;\n }\n\n console.info('ℹ️ Found transfer configuration in your environment:');\n\n if (hasEnvUrl) {\n console.info(\n ` → Environment STRAPI_TRANSFER_URL (${hasEnvUrl}) will be used as the transfer URL`\n );\n }\n\n if (hasEnvToken) {\n console.info(\n ' → Environment STRAPI_TRANSFER_TOKEN value will be used as the transfer token'\n );\n }\n\n console.info(); // Empty line for better readability\n };\n\n const determineDirection = async () => {\n // If user has not provided a direction from CLI, log the documentation\n if (!opts.from && !opts.to) {\n logDocumentation();\n }\n\n logEnvironmentVariables();\n\n if (opts.from) {\n return 'from';\n }\n if (opts.to) {\n return 'to';\n }\n\n const inquirer = await getInquirer();\n const { dir } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dir',\n message: 'Choose transfer direction:',\n choices: [\n { name: 'Pull data from remote Strapi to local', value: 'from' },\n { name: 'Push local data to remote Strapi', value: 'to' },\n ],\n },\n ]);\n\n return dir;\n };\n\n const determineUrl = async (direction: 'from' | 'to') => {\n if (opts[direction]) {\n return new URL(opts[direction]);\n }\n\n if (process.env.STRAPI_TRANSFER_URL) {\n return new URL(process.env.STRAPI_TRANSFER_URL);\n }\n\n const inquirer = await getInquirer();\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'remoteUrl',\n message: `Enter the URL of the remote Strapi instance to ${direction === 'from' ? 'get data from' : 'send data to'}:`,\n default: process.env.STRAPI_TRANSFER_URL,\n validate(input: string) {\n try {\n const url = new URL(input);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return 'URL must use http: or https: protocol';\n }\n return true;\n } catch (error) {\n return 'Please enter a valid URL (e.g., http://localhost:1337/admin or https://example.com/admin)';\n }\n },\n },\n ]);\n\n return new URL(answer.remoteUrl);\n };\n\n const determineToken = async (direction: 'from' | 'to') => {\n if (opts[`${direction}Token`]) {\n return opts[`${direction}Token`];\n }\n\n if (process.env.STRAPI_TRANSFER_TOKEN) {\n return process.env.STRAPI_TRANSFER_TOKEN;\n }\n\n const inquirer = await getInquirer();\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: `Enter the transfer token for the remote Strapi ${direction === 'from' ? 'source' : 'destination'}:`,\n default: process.env.STRAPI_TRANSFER_TOKEN,\n validate(input: string) {\n if (!input?.length) {\n return 'Transfer token is required';\n }\n return true;\n },\n },\n ]);\n\n return answer.token;\n };\n\n const direction = await determineDirection();\n opts[direction] = await determineUrl(direction);\n opts[`${direction}Token`] = await determineToken(direction);\n }\n )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi source',\n name: 'fromToken',\n },\n ]);\n if (!answers.fromToken?.length) {\n exitWith(1, 'No token provided for remote source, aborting transfer.');\n }\n thisCommand.opts().fromToken = answers.fromToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete all the local Strapi assets and its database. Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n // If --to is used, validate the URL, token, and confirm restore\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi destination',\n name: 'toToken',\n },\n ]);\n if (!answers.toToken?.length) {\n exitWith(1, 'No token provided for remote destination, aborting transfer.');\n }\n thisCommand.opts().toToken = answers.toToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete existing data from the remote Strapi! Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["command","createCommand","description","allowExcessArguments","addOption","Option","argParser","parseURL","forceOption","excludeOption","onlyOption","throttleOption","hook","validateExcludeOnly","ifOptions","opts","from","to","toToken","fromToken","exitWith","thisCommand","hasEnvUrl","process","env","STRAPI_TRANSFER_URL","hasEnvToken","STRAPI_TRANSFER_TOKEN","logDocumentation","console","info","logEnvironmentVariables","determineDirection","inquirer","getInquirer","dir","prompt","type","name","message","choices","value","determineUrl","direction","URL","answer","default","validate","input","url","includes","protocol","error","remoteUrl","determineToken","length","token","assertUrlHasProtocol","answers","getCommanderConfirmMessage","failMessage","action"],"mappings":";;;;;;;AAaA;;AAEC,UACKA,OAAAA,GAAU,IAAA;IACd,OACEC,aAAAA,CAAc,UAAA,CAAA,CACXC,WAAW,CAAC,0CAAA,CAAA,CACZC,oBAAoB,CAAC,KAAA,CAAA,CACrBC,SAAS,CACR,IAAIC,MAAAA,CACF,sBACA,CAAC,kDAAkD,CAAC,CAAA,CACpDC,SAAS,CAACC,WAEbH,SAAS,CAAC,IAAIC,MAAAA,CAAO,sBAAA,EAAwB,CAAC,2CAA2C,CAAC,CAAA,CAAA,CAC1FD,SAAS,CACR,IAAIC,MAAAA,CACF,yBACA,CAAC,iDAAiD,CAAC,CAAA,CACnDC,SAAS,CAACC,WAGbH,SAAS,CACR,IAAIC,MAAAA,CAAO,oBAAA,EAAsB,CAAC,gDAAgD,CAAC,CAAA,CAAA,CAEpFD,SAAS,CACR,IAAIC,MAAAA,CACF,gBAAA,EACA,uEAGHD,SAAS,CAAC,IAAIC,MAAAA,CAAO,WAAA,EAAa,qBAAA,CAAA,CAAA,CAClCD,SAAS,CAACI,WAAAA,CAAAA,CACVJ,SAAS,CAACK,aAAAA,CAAAA,CACVL,SAAS,CAACM,UAAAA,CAAAA,CACVN,SAAS,CAACO,cAAAA,CAAAA,CACVC,IAAI,CAAC,WAAA,EAAaC,mBAAAA,CAAAA,CAClBD,IAAI,CACH,WAAA,EACAE,SAAAA,CACE,OAAOC,IAAAA,GACL,IAACA,CAAKC,IAAI,IAAID,IAAAA,CAAKE,EAAE,IAAMF,KAAKC,IAAI,IAAID,IAAAA,CAAKG,OAAO,IAAMH,IAAAA,CAAKE,EAAE,IAAIF,IAAAA,CAAKI,SAAS,EACrF,UACEC,QAAAA,CAAS,CAAA,EAAG,0EAAA,CAAA,CAAA,CAAA,CAGjBR,IAAI,CACH,WAAA,EACAE,SAAAA;IAEE,OAAOC,IAAAA,GAAS,CAACA,IAAAA,CAAKC,IAAI,IAAI,CAACD,IAAAA,CAAKE,EAAE,EACtC,OAAOI,WAAAA,GAAAA;QACL,MAAMN,IAAAA,GAAOM,YAAYN,IAAI,EAAA;AAC7B,QAAA,MAAMO,SAAAA,GAAYC,OAAAA,CAAQC,GAAG,CAACC,mBAAmB;AACjD,QAAA,MAAMC,WAAAA,GAAcH,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAErD,QAAA,MAAMC,gBAAAA,GAAmB,IAAA;AACvBC,YAAAA,OAAAA,CAAQC,IAAI,CACV,2FAAA,CAAA;AAEJ,QAAA,CAAA;AAEA,QAAA,MAAMC,uBAAAA,GAA0B,IAAA;YAC9B,IAAI,CAACT,SAAAA,IAAa,CAACI,WAAAA,EAAa;AAC9BG,gBAAAA,OAAAA,CAAQC,IAAI,CAAC,8DAAA,CAAA;AACbD,gBAAAA,OAAAA,CAAQC,IAAI,CACV,kIAAA,CAAA;AAEF,gBAAA;AACF,YAAA;AAEAD,YAAAA,OAAAA,CAAQC,IAAI,CAAC,uDAAA,CAAA;AAEb,YAAA,IAAIR,SAAAA,EAAW;AACbO,gBAAAA,OAAAA,CAAQC,IAAI,CACV,CAAC,sCAAsC,EAAER,SAAAA,CAAU,kCAAkC,CAAC,CAAA;AAE1F,YAAA;AAEA,YAAA,IAAII,WAAAA,EAAa;AACfG,gBAAAA,OAAAA,CAAQC,IAAI,CACV,iFAAA,CAAA;AAEJ,YAAA;YAEAD,OAAAA,CAAQC,IAAI;AACd,QAAA,CAAA;AAEA,QAAA,MAAME,kBAAAA,GAAqB,UAAA;;AAEzB,YAAA,IAAI,CAACjB,IAAAA,CAAKC,IAAI,IAAI,CAACD,IAAAA,CAAKE,EAAE,EAAE;AAC1BW,gBAAAA,gBAAAA,EAAAA;AACF,YAAA;AAEAG,YAAAA,uBAAAA,EAAAA;YAEA,IAAIhB,IAAAA,CAAKC,IAAI,EAAE;gBACb,OAAO,MAAA;AACT,YAAA;YACA,IAAID,IAAAA,CAAKE,EAAE,EAAE;gBACX,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAMgB,WAAW,MAAMC,WAAAA,EAAAA;AACvB,YAAA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAMF,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,MAAA;oBACNC,IAAAA,EAAM,KAAA;oBACNC,OAAAA,EAAS,4BAAA;oBACTC,OAAAA,EAAS;AACP,wBAAA;4BAAEF,IAAAA,EAAM,uCAAA;4BAAyCG,KAAAA,EAAO;AAAO,yBAAA;AAC/D,wBAAA;4BAAEH,IAAAA,EAAM,kCAAA;4BAAoCG,KAAAA,EAAO;AAAK;AACzD;AACH;AACD,aAAA,CAAA;YAED,OAAON,GAAAA;AACT,QAAA,CAAA;AAEA,QAAA,MAAMO,eAAe,OAAOC,SAAAA,GAAAA;YAC1B,IAAI5B,IAAI,CAAC4B,SAAAA,CAAU,EAAE;AACnB,gBAAA,OAAO,IAAIC,GAAAA,CAAI7B,IAAI,CAAC4B,SAAAA,CAAU,CAAA;AAChC,YAAA;AAEA,YAAA,IAAIpB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB,EAAE;AACnC,gBAAA,OAAO,IAAImB,GAAAA,CAAIrB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB,CAAA;AAChD,YAAA;AAEA,YAAA,MAAMQ,WAAW,MAAMC,WAAAA,EAAAA;AACvB,YAAA,MAAMW,MAAAA,GAAS,MAAMZ,QAAAA,CAASG,MAAM,CAAC;AACnC,gBAAA;oBACEC,IAAAA,EAAM,OAAA;oBACNC,IAAAA,EAAM,WAAA;oBACNC,OAAAA,EAAS,CAAC,+CAA+C,EAAEI,SAAAA,KAAc,SAAS,eAAA,GAAkB,cAAA,CAAe,CAAC,CAAC;oBACrHG,OAAAA,EAASvB,OAAAA,CAAQC,GAAG,CAACC,mBAAmB;AACxCsB,oBAAAA,QAAAA,CAAAA,CAASC,KAAa,EAAA;wBACpB,IAAI;4BACF,MAAMC,GAAAA,GAAM,IAAIL,GAAAA,CAAII,KAAAA,CAAAA;AACpB,4BAAA,IAAI,CAAC;AAAC,gCAAA,OAAA;AAAS,gCAAA;AAAS,6BAAA,CAACE,QAAQ,CAACD,GAAAA,CAAIE,QAAQ,CAAA,EAAG;gCAC/C,OAAO,uCAAA;AACT,4BAAA;4BACA,OAAO,IAAA;AACT,wBAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;4BACd,OAAO,2FAAA;AACT,wBAAA;AACF,oBAAA;AACF;AACD,aAAA,CAAA;YAED,OAAO,IAAIR,GAAAA,CAAIC,MAAAA,CAAOQ,SAAS,CAAA;AACjC,QAAA,CAAA;AAEA,QAAA,MAAMC,iBAAiB,OAAOX,SAAAA,GAAAA;AAC5B,YAAA,IAAI5B,IAAI,CAAC,CAAA,EAAG4B,UAAU,KAAK,CAAC,CAAC,EAAE;AAC7B,gBAAA,OAAO5B,IAAI,CAAC,CAAA,EAAG4B,SAAAA,CAAU,KAAK,CAAC,CAAC;AAClC,YAAA;AAEA,YAAA,IAAIpB,OAAAA,CAAQC,GAAG,CAACG,qBAAqB,EAAE;gBACrC,OAAOJ,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAC1C,YAAA;AAEA,YAAA,MAAMM,WAAW,MAAMC,WAAAA,EAAAA;AACvB,YAAA,MAAMW,MAAAA,GAAS,MAAMZ,QAAAA,CAASG,MAAM,CAAC;AACnC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNC,IAAAA,EAAM,OAAA;oBACNC,OAAAA,EAAS,CAAC,+CAA+C,EAAEI,SAAAA,KAAc,SAAS,QAAA,GAAW,aAAA,CAAc,CAAC,CAAC;oBAC7GG,OAAAA,EAASvB,OAAAA,CAAQC,GAAG,CAACG,qBAAqB;AAC1CoB,oBAAAA,QAAAA,CAAAA,CAASC,KAAa,EAAA;wBACpB,IAAI,CAACA,OAAOO,MAAAA,EAAQ;4BAClB,OAAO,4BAAA;AACT,wBAAA;wBACA,OAAO,IAAA;AACT,oBAAA;AACF;AACD,aAAA,CAAA;AAED,YAAA,OAAOV,OAAOW,KAAK;AACrB,QAAA,CAAA;AAEA,QAAA,MAAMb,YAAY,MAAMX,kBAAAA,EAAAA;AACxBjB,QAAAA,IAAI,CAAC4B,SAAAA,CAAU,GAAG,MAAMD,YAAAA,CAAaC,SAAAA,CAAAA;QACrC5B,IAAI,CAAC,GAAG4B,SAAAA,CAAU,KAAK,CAAC,CAAC,GAAG,MAAMW,cAAAA,CAAeX,SAAAA,CAAAA;AACnD,IAAA,CAAA,CAAA,CAGJ;KACC/B,IAAI,CACH,aACAE,SAAAA,CACE,OAAOC,OAASA,IAAAA,CAAKC,IAAI,EACzB,OAAOK,WAAAA,GAAAA;AACLoC,QAAAA,oBAAAA,CAAqBpC,WAAAA,CAAYN,IAAI,EAAA,CAAGC,IAAI,EAAE;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA,CAAA;AACjE,QAAA,IAAI,CAACK,WAAAA,CAAYN,IAAI,EAAA,CAAGI,SAAS,EAAE;AACjC,YAAA,MAAMc,WAAW,MAAMC,WAAAA,EAAAA;AACvB,YAAA,MAAMwB,OAAAA,GAAU,MAAMzB,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNE,OAAAA,EAAS,+DAAA;oBACTD,IAAAA,EAAM;AACR;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACoB,OAAAA,CAAQvC,SAAS,EAAEoC,MAAAA,EAAQ;AAC9BnC,gBAAAA,QAAAA,CAAS,CAAA,EAAG,yDAAA,CAAA;AACd,YAAA;AACAC,YAAAA,WAAAA,CAAYN,IAAI,EAAA,CAAGI,SAAS,GAAGuC,QAAQvC,SAAS;AAClD,QAAA;AAEA,QAAA,MAAMwC,2BACJ,0GAAA,EACA;YAAEC,WAAAA,EAAa;SAA2B,CAAA,CAC1CvC,WAAAA,CAAAA;AACJ,IAAA,CAAA,CAAA,CAGJ;KACCT,IAAI,CACH,aACAE,SAAAA,CACE,OAAOC,OAASA,IAAAA,CAAKE,EAAE,EACvB,OAAOI,WAAAA,GAAAA;AACLoC,QAAAA,oBAAAA,CAAqBpC,WAAAA,CAAYN,IAAI,EAAA,CAAGE,EAAE,EAAE;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA,CAAA;AAC/D,QAAA,IAAI,CAACI,WAAAA,CAAYN,IAAI,EAAA,CAAGG,OAAO,EAAE;AAC/B,YAAA,MAAMe,WAAW,MAAMC,WAAAA,EAAAA;AACvB,YAAA,MAAMwB,OAAAA,GAAU,MAAMzB,QAAAA,CAASG,MAAM,CAAC;AACpC,gBAAA;oBACEC,IAAAA,EAAM,UAAA;oBACNE,OAAAA,EAAS,oEAAA;oBACTD,IAAAA,EAAM;AACR;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACoB,OAAAA,CAAQxC,OAAO,EAAEqC,MAAAA,EAAQ;AAC5BnC,gBAAAA,QAAAA,CAAS,CAAA,EAAG,8DAAA,CAAA;AACd,YAAA;AACAC,YAAAA,WAAAA,CAAYN,IAAI,EAAA,CAAGG,OAAO,GAAGwC,QAAQxC,OAAO;AAC9C,QAAA;AAEA,QAAA,MAAMyC,2BACJ,kGAAA,EACA;YAAEC,WAAAA,EAAa;SAA2B,CAAA,CAC1CvC,WAAAA,CAAAA;AACJ,IAAA,CAAA,CAAA,CAAA,CAGHwC,MAAM,CAACA,MAAAA,CAAAA;AAEd;;;;"}
1
+ {"version":3,"file":"command.mjs","sources":["../../../../../src/cli/commands/transfer/command.ts"],"sourcesContent":["import { createCommand, Option } from 'commander';\nimport { getCommanderConfirmMessage, forceOption, parseURL } from '../../utils/commander';\nimport { getInquirer } from '../../utils/get-inquirer';\nimport { exitWith, assertUrlHasProtocol, ifOptions } from '../../utils/helpers';\nimport {\n excludeOption,\n onlyOption,\n excludeContentTypesOption,\n onlyContentTypesOption,\n throttleOption,\n validateExcludeOnly,\n validateContentTypeTransferOptions,\n normalizeTransferFilterOptionsHook,\n} from '../../utils/data-transfer';\n\nimport action from './action';\n\n/**\n * `$ strapi transfer`\n */\nconst command = () => {\n return (\n createCommand('transfer')\n .description('Transfer data from one source to another')\n .allowExcessArguments(false)\n .addOption(\n new Option(\n '--from <sourceURL>',\n `URL of the remote Strapi instance to get data from`\n ).argParser(parseURL)\n )\n .addOption(new Option('--from-token <token>', `Transfer token for the remote Strapi source`))\n .addOption(\n new Option(\n '--to <destinationURL>',\n `URL of the remote Strapi instance to send data to`\n ).argParser(parseURL)\n )\n\n .addOption(\n new Option('--to-token <token>', `Transfer token for the remote Strapi destination`)\n )\n .addOption(\n new Option(\n '--no-checksums',\n 'Disable end-to-end asset checksum verification for assets transfer'\n )\n )\n .addOption(new Option('--verbose', 'Enable verbose logs'))\n .addOption(forceOption)\n .addOption(excludeOption)\n .addOption(onlyOption)\n .addOption(excludeContentTypesOption)\n .addOption(onlyContentTypesOption)\n .addOption(throttleOption)\n .hook('preAction', normalizeTransferFilterOptionsHook)\n .hook('preAction', validateExcludeOnly)\n .hook('preAction', validateContentTypeTransferOptions)\n .hook(\n 'preAction',\n ifOptions(\n async (opts) =>\n (opts.from && opts.to) || (opts.from && opts.toToken) || (opts.to && opts.fromToken),\n async () =>\n exitWith(1, 'Only one remote source (from) or destination (to) option may be provided')\n )\n )\n .hook(\n 'preAction',\n ifOptions(\n // Only run interactive prompts if neither --from nor --to is provided\n async (opts) => !opts.from && !opts.to,\n async (thisCommand) => {\n const opts = thisCommand.opts();\n const hasEnvUrl = process.env.STRAPI_TRANSFER_URL;\n const hasEnvToken = process.env.STRAPI_TRANSFER_TOKEN;\n\n const logDocumentation = () => {\n console.info(\n 'ℹ️ Data transfer documentation: https://docs.strapi.io/dev-docs/data-management/transfer'\n );\n };\n\n const logEnvironmentVariables = () => {\n if (!hasEnvUrl && !hasEnvToken) {\n console.info('ℹ️ No transfer configuration found in environment variables');\n console.info(\n ' → Add STRAPI_TRANSFER_URL and STRAPI_TRANSFER_TOKEN environment variables to make the transfer process faster for future runs'\n );\n return;\n }\n\n console.info('ℹ️ Found transfer configuration in your environment:');\n\n if (hasEnvUrl) {\n console.info(\n ` → Environment STRAPI_TRANSFER_URL (${hasEnvUrl}) will be used as the transfer URL`\n );\n }\n\n if (hasEnvToken) {\n console.info(\n ' → Environment STRAPI_TRANSFER_TOKEN value will be used as the transfer token'\n );\n }\n\n console.info(); // Empty line for better readability\n };\n\n const determineDirection = async () => {\n // If user has not provided a direction from CLI, log the documentation\n if (!opts.from && !opts.to) {\n logDocumentation();\n }\n\n logEnvironmentVariables();\n\n if (opts.from) {\n return 'from';\n }\n if (opts.to) {\n return 'to';\n }\n\n const inquirer = await getInquirer();\n const { dir } = await inquirer.prompt([\n {\n type: 'list',\n name: 'dir',\n message: 'Choose transfer direction:',\n choices: [\n { name: 'Pull data from remote Strapi to local', value: 'from' },\n { name: 'Push local data to remote Strapi', value: 'to' },\n ],\n },\n ]);\n\n return dir;\n };\n\n const determineUrl = async (direction: 'from' | 'to') => {\n if (opts[direction]) {\n return new URL(opts[direction]);\n }\n\n if (process.env.STRAPI_TRANSFER_URL) {\n return new URL(process.env.STRAPI_TRANSFER_URL);\n }\n\n const inquirer = await getInquirer();\n const answer = await inquirer.prompt([\n {\n type: 'input',\n name: 'remoteUrl',\n message: `Enter the URL of the remote Strapi instance to ${direction === 'from' ? 'get data from' : 'send data to'}:`,\n default: process.env.STRAPI_TRANSFER_URL,\n validate(input: string) {\n try {\n const url = new URL(input);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return 'URL must use http: or https: protocol';\n }\n return true;\n } catch (error) {\n return 'Please enter a valid URL (e.g., http://localhost:1337/admin or https://example.com/admin)';\n }\n },\n },\n ]);\n\n return new URL(answer.remoteUrl);\n };\n\n const determineToken = async (direction: 'from' | 'to') => {\n if (opts[`${direction}Token`]) {\n return opts[`${direction}Token`];\n }\n\n if (process.env.STRAPI_TRANSFER_TOKEN) {\n return process.env.STRAPI_TRANSFER_TOKEN;\n }\n\n const inquirer = await getInquirer();\n const answer = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: `Enter the transfer token for the remote Strapi ${direction === 'from' ? 'source' : 'destination'}:`,\n default: process.env.STRAPI_TRANSFER_TOKEN,\n validate(input: string) {\n if (!input?.length) {\n return 'Transfer token is required';\n }\n return true;\n },\n },\n ]);\n\n return answer.token;\n };\n\n const direction = await determineDirection();\n opts[direction] = await determineUrl(direction);\n opts[`${direction}Token`] = await determineToken(direction);\n }\n )\n )\n // If --from is used, validate the URL and token\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.from,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().from, ['https:', 'http:']);\n if (!thisCommand.opts().fromToken) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi source',\n name: 'fromToken',\n },\n ]);\n if (!answers.fromToken?.length) {\n exitWith(1, 'No token provided for remote source, aborting transfer.');\n }\n thisCommand.opts().fromToken = answers.fromToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete all the local Strapi assets and its database. Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n // If --to is used, validate the URL, token, and confirm restore\n .hook(\n 'preAction',\n ifOptions(\n async (opts) => opts.to,\n async (thisCommand) => {\n assertUrlHasProtocol(thisCommand.opts().to, ['https:', 'http:']);\n if (!thisCommand.opts().toToken) {\n const inquirer = await getInquirer();\n const answers = await inquirer.prompt([\n {\n type: 'password',\n message: 'Please enter your transfer token for the remote Strapi destination',\n name: 'toToken',\n },\n ]);\n if (!answers.toToken?.length) {\n exitWith(1, 'No token provided for remote destination, aborting transfer.');\n }\n thisCommand.opts().toToken = answers.toToken;\n }\n\n await getCommanderConfirmMessage(\n 'The transfer will delete existing data from the remote Strapi! Are you sure you want to proceed?',\n { failMessage: 'Transfer process aborted' }\n )(thisCommand);\n }\n )\n )\n .action(action)\n );\n};\n\nexport default command;\n"],"names":["command","createCommand","description","allowExcessArguments","addOption","Option","argParser","parseURL","forceOption","excludeOption","onlyOption","excludeContentTypesOption","onlyContentTypesOption","throttleOption","hook","normalizeTransferFilterOptionsHook","validateExcludeOnly","validateContentTypeTransferOptions","ifOptions","opts","from","to","toToken","fromToken","exitWith","thisCommand","hasEnvUrl","process","env","STRAPI_TRANSFER_URL","hasEnvToken","STRAPI_TRANSFER_TOKEN","logDocumentation","console","info","logEnvironmentVariables","determineDirection","inquirer","getInquirer","dir","prompt","type","name","message","choices","value","determineUrl","direction","URL","answer","default","validate","input","url","includes","protocol","error","remoteUrl","determineToken","length","token","assertUrlHasProtocol","answers","getCommanderConfirmMessage","failMessage","action"],"mappings":"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"}
@@ -118,6 +118,10 @@ const IGNORED_CONTENT_TYPES = [
118
118
  'plugin::content-releases.release',
119
119
  'plugin::content-releases.release-action'
120
120
  ];
121
+ /** Media library content types — common target for `--exclude-content-types` (see issue #25008). */ const UPLOAD_CONTENT_TYPE_UIDS = [
122
+ 'plugin::upload.file',
123
+ 'plugin::upload.folder'
124
+ ];
121
125
  const isIgnoredContentType = (type)=>IGNORED_CONTENT_TYPE_PREFIXES.some((prefix)=>type.startsWith(prefix)) || IGNORED_CONTENT_TYPES.includes(type);
122
126
  const abortTransfer = async ({ engine, strapi: strapi1 })=>{
123
127
  try {
@@ -158,15 +162,25 @@ const createStrapiInstance = async (opts = {})=>{
158
162
  }
159
163
  };
160
164
  const transferDataTypes = Object.keys(dataTransfer.engine.TransferGroupPresets);
165
+ const MEDIA_LIBRARY_PRESET = 'media-library';
161
166
  const TRANSFER_FILTER_PRESET_DESCRIPTIONS = {
162
167
  content: 'entities and links (incl. media library DB records)',
163
168
  files: 'upload binaries in public/uploads (not media library DB records)',
164
- config: 'core store and webhooks'
169
+ config: 'core store and webhooks',
170
+ [MEDIA_LIBRARY_PRESET]: 'upload binaries and media library DB records (files + plugin::upload.file, plugin::upload.folder)'
165
171
  };
166
- const transferFilterPresetsHelp = transferDataTypes.map((type)=>`${type} (${TRANSFER_FILTER_PRESET_DESCRIPTIONS[type]})`).join('; ');
172
+ const transferExcludePresetChoices = [
173
+ ...transferDataTypes,
174
+ MEDIA_LIBRARY_PRESET
175
+ ];
176
+ const formatTransferPresetHelp = (types)=>types.map((type)=>`${type} (${TRANSFER_FILTER_PRESET_DESCRIPTIONS[type]})`).join('; ');
177
+ const transferExcludePresetsHelp = formatTransferPresetHelp(transferExcludePresetChoices);
178
+ const transferOnlyPresetsHelp = formatTransferPresetHelp(transferDataTypes);
167
179
  const throttleOption = new commander.Option('--throttle <delay after each entity>', `Add a delay in milliseconds between each transferred entity`).argParser(commander$1.parseInteger).hideHelp(); // This option is not publicly documented
168
- const excludeOption = new commander.Option('--exclude <comma-separated data types>', `Exclude data: ${transferFilterPresetsHelp}`).argParser(commander$1.getParseListWithChoices(transferDataTypes, 'Invalid options for "exclude"'));
169
- const onlyOption = new commander.Option('--only <command-separated data types>', `Include only these types (plus schemas): ${transferFilterPresetsHelp}`).argParser(commander$1.getParseListWithChoices(transferDataTypes, 'Invalid options for "only"'));
180
+ const excludeOption = new commander.Option('--exclude <comma-separated data types>', `Exclude data: ${transferExcludePresetsHelp}`).argParser(commander$1.getParseListWithChoices(transferExcludePresetChoices, 'Invalid options for "exclude"'));
181
+ const onlyOption = new commander.Option('--only <command-separated data types>', `Include only these types (plus schemas): ${transferOnlyPresetsHelp}`).argParser(commander$1.getParseListWithChoices(transferDataTypes, 'Invalid options for "only"'));
182
+ const excludeContentTypesOption = new commander.Option('--exclude-content-types <comma-separated UIDs>', `Exclude content types from entities and links (e.g. ${UPLOAD_CONTENT_TYPE_UIDS.join(',')} to omit the media library; or use --exclude media-library to skip binaries and upload records — see issue #25008)`).argParser(commander$1.parseList);
183
+ const onlyContentTypesOption = new commander.Option('--only-content-types <comma-separated UIDs>', 'Transfer only these content types in entities and links (e.g. api::article.article)').argParser(commander$1.parseList);
170
184
  const validateExcludeOnly = (command)=>{
171
185
  const { exclude, only } = command.opts();
172
186
  if (!only || !exclude) {
@@ -179,6 +193,61 @@ const validateExcludeOnly = (command)=>{
179
193
  helpers.exitWith(1, `Data types may not be used in both "exclude" and "only" in the same command. Found in both: ${choicesInBoth.join(',')}`);
180
194
  }
181
195
  };
196
+ const validateContentTypeTransferOptions = (command)=>{
197
+ const { excludeContentTypes, onlyContentTypes } = command.opts();
198
+ if (!excludeContentTypes?.length || !onlyContentTypes?.length) {
199
+ return;
200
+ }
201
+ const overlap = excludeContentTypes.filter((uid)=>onlyContentTypes.includes(uid));
202
+ if (overlap.length > 0) {
203
+ helpers.exitWith(1, `Content types may not be used in both "--exclude-content-types" and "--only-content-types". Found in both: ${overlap.join(',')}`);
204
+ }
205
+ };
206
+ const assertKnownContentTypes = (uids, strapi1, flag)=>{
207
+ const known = new Set(Object.keys(strapi1.contentTypes));
208
+ const unknown = uids.filter((uid)=>!known.has(uid));
209
+ if (unknown.length > 0) {
210
+ helpers.exitWith(1, `Unknown content type(s) for ${flag}: ${unknown.join(', ')}`);
211
+ }
212
+ };
213
+ const validateContentTypeTransferOptionsForStrapi = (opts, strapi1)=>{
214
+ if (opts.excludeContentTypes?.length) {
215
+ assertKnownContentTypes(opts.excludeContentTypes, strapi1, '--exclude-content-types');
216
+ }
217
+ if (opts.onlyContentTypes?.length) {
218
+ assertKnownContentTypes(opts.onlyContentTypes, strapi1, '--only-content-types');
219
+ }
220
+ };
221
+ const shouldIncludeContentTypeInTransfer = (uid, opts)=>{
222
+ if (isIgnoredContentType(uid)) {
223
+ return false;
224
+ }
225
+ if (opts.excludeContentTypes?.includes(uid)) {
226
+ return false;
227
+ }
228
+ if (opts.onlyContentTypes?.length) {
229
+ return opts.onlyContentTypes.includes(uid);
230
+ }
231
+ return true;
232
+ };
233
+ const createEntityFilter = (opts)=>{
234
+ return (entity)=>shouldIncludeContentTypeInTransfer(entity.type, opts);
235
+ };
236
+ const createLinkFilter = (opts)=>{
237
+ return (link)=>shouldIncludeContentTypeInTransfer(link.left.type, opts) && shouldIncludeContentTypeInTransfer(link.right.type, opts);
238
+ };
239
+ const buildTransferTransforms = (opts)=>({
240
+ links: [
241
+ {
242
+ filter: createLinkFilter(opts)
243
+ }
244
+ ],
245
+ entities: [
246
+ {
247
+ filter: createEntityFilter(opts)
248
+ }
249
+ ]
250
+ });
182
251
  const errorColors = {
183
252
  fatal: chalk__default.default.red,
184
253
  error: chalk__default.default.red,
@@ -394,9 +463,47 @@ const shouldSkipStage = (opts, dataKind)=>{
394
463
  }
395
464
  return false;
396
465
  };
466
+ const areUploadContentTypesInTransferScope = (opts)=>UPLOAD_CONTENT_TYPE_UIDS.every((uid)=>shouldIncludeContentTypeInTransfer(uid, opts));
467
+ const areAllUploadContentTypesOutOfTransferScope = (opts)=>UPLOAD_CONTENT_TYPE_UIDS.every((uid)=>!shouldIncludeContentTypeInTransfer(uid, opts));
468
+ const isContentStageActive = (opts)=>!shouldSkipStage(opts, 'content');
469
+ const expandMediaLibraryPreset = (opts)=>{
470
+ if (!opts.exclude?.includes(MEDIA_LIBRARY_PRESET)) {
471
+ return;
472
+ }
473
+ const exclude = opts.exclude.filter((item)=>item !== MEDIA_LIBRARY_PRESET);
474
+ opts.exclude = exclude;
475
+ if (!opts.exclude.includes('files')) {
476
+ opts.exclude.push('files');
477
+ }
478
+ const excludeContentTypes = new Set(opts.excludeContentTypes ?? []);
479
+ for (const uid of UPLOAD_CONTENT_TYPE_UIDS){
480
+ excludeContentTypes.add(uid);
481
+ }
482
+ opts.excludeContentTypes = [
483
+ ...excludeContentTypes
484
+ ];
485
+ };
486
+ const autoExcludeFilesWhenUploadTypesOutOfScope = (opts)=>{
487
+ if (opts.filesAutoExcluded || !isContentStageActive(opts) || opts.only?.includes('files') || shouldSkipStage(opts, 'files') || !areAllUploadContentTypesOutOfTransferScope(opts)) {
488
+ return;
489
+ }
490
+ opts.exclude = [
491
+ ...opts.exclude ?? [],
492
+ 'files'
493
+ ];
494
+ opts.filesAutoExcluded = true;
495
+ };
496
+ const normalizeTransferFilterOptions = (opts)=>{
497
+ expandMediaLibraryPreset(opts);
498
+ autoExcludeFilesWhenUploadTypesOutOfScope(opts);
499
+ return opts;
500
+ };
501
+ const normalizeTransferFilterOptionsHook = (command)=>{
502
+ normalizeTransferFilterOptions(command.opts());
503
+ };
397
504
  const logTransferFilterSummary = (opts)=>{
398
- const { exclude, only } = opts;
399
- if (!exclude?.length && !only?.length) {
505
+ const { exclude, only, excludeContentTypes, onlyContentTypes } = opts;
506
+ if (!exclude?.length && !only?.length && !excludeContentTypes?.length && !onlyContentTypes?.length) {
400
507
  return;
401
508
  }
402
509
  const parts = [];
@@ -406,8 +513,23 @@ const logTransferFilterSummary = (opts)=>{
406
513
  if (only?.length) {
407
514
  parts.push(`only ${only.join(', ')}`);
408
515
  }
409
- console.log(chalk__default.default.dim(`Transfer filters: ${parts.join('; ')}.`));
410
- if (shouldSkipStage(opts, 'files') && !shouldSkipStage(opts, 'content')) {
516
+ if (parts.length) {
517
+ console.log(chalk__default.default.dim(`Transfer filters: ${parts.join('; ')}.`));
518
+ }
519
+ const contentTypeParts = [];
520
+ if (excludeContentTypes?.length) {
521
+ contentTypeParts.push(`excluding ${excludeContentTypes.join(', ')}`);
522
+ }
523
+ if (onlyContentTypes?.length) {
524
+ contentTypeParts.push(`only ${onlyContentTypes.join(', ')}`);
525
+ }
526
+ if (contentTypeParts.length) {
527
+ console.log(chalk__default.default.dim(`Content type filters: ${contentTypeParts.join('; ')}.`));
528
+ }
529
+ if (opts.filesAutoExcluded) {
530
+ console.log(chalk__default.default.dim('Skipping files stage: upload content types are not in transfer scope (plugin::upload.file, plugin::upload.folder).'));
531
+ }
532
+ if (shouldSkipStage(opts, 'files') && !shouldSkipStage(opts, 'content') && areUploadContentTypesInTransferScope(opts) && !opts.filesAutoExcluded) {
411
533
  console.log(chalk__default.default.dim('Note: Media library records (plugin::upload.file, plugin::upload.folder) are still transferred with the rest of your content (the entities stage). Sync upload binaries separately (e.g. rsync public/uploads).'));
412
534
  }
413
535
  };
@@ -416,7 +538,8 @@ const parseRestoreFromOptions = (opts, strapi1)=>{
416
538
  const entitiesOptions = {
417
539
  exclude: [
418
540
  ...Object.keys(strapi1.contentTypes).filter(isIgnoredContentType),
419
- ...IGNORED_CONTENT_TYPES
541
+ ...IGNORED_CONTENT_TYPES,
542
+ ...opts.excludeContentTypes ?? []
420
543
  ],
421
544
  include: undefined
422
545
  };
@@ -424,10 +547,13 @@ const parseRestoreFromOptions = (opts, strapi1)=>{
424
547
  if (!contentInScope) {
425
548
  // Nothing from the entities stage is transferred; do not delete any records beforehand.
426
549
  entitiesOptions.include = [];
550
+ } else if (opts.onlyContentTypes?.length) {
551
+ // Only wipe content types that are being replaced by this transfer.
552
+ entitiesOptions.include = opts.onlyContentTypes;
427
553
  } else if (shouldSkipStage(opts, 'config')) {
428
554
  // When config is excluded, scope pre-transfer deletion to user content types only.
429
555
  // Internal models (e.g. strapi::core-store) must not be wiped via the entities path.
430
- entitiesOptions.include = Object.keys(strapi1.contentTypes).filter((uid)=>!isIgnoredContentType(uid));
556
+ entitiesOptions.include = Object.keys(strapi1.contentTypes).filter((uid)=>!isIgnoredContentType(uid) && !opts.excludeContentTypes?.includes(uid));
431
557
  }
432
558
  const restoreConfig = {
433
559
  entities: entitiesOptions,
@@ -440,9 +566,16 @@ const parseRestoreFromOptions = (opts, strapi1)=>{
440
566
  return restoreConfig;
441
567
  };
442
568
 
569
+ exports.UPLOAD_CONTENT_TYPE_UIDS = UPLOAD_CONTENT_TYPE_UIDS;
443
570
  exports.abortTransfer = abortTransfer;
571
+ exports.areAllUploadContentTypesOutOfTransferScope = areAllUploadContentTypesOutOfTransferScope;
572
+ exports.areUploadContentTypesInTransferScope = areUploadContentTypesInTransferScope;
444
573
  exports.buildTransferTable = buildTransferTable;
574
+ exports.buildTransferTransforms = buildTransferTransforms;
575
+ exports.createEntityFilter = createEntityFilter;
576
+ exports.createLinkFilter = createLinkFilter;
445
577
  exports.createStrapiInstance = createStrapiInstance;
578
+ exports.excludeContentTypesOption = excludeContentTypesOption;
446
579
  exports.excludeOption = excludeOption;
447
580
  exports.exitMessageText = exitMessageText;
448
581
  exports.formatDiagnostic = formatDiagnostic;
@@ -453,10 +586,15 @@ exports.getTransferTelemetryPayload = getTransferTelemetryPayload;
453
586
  exports.isIgnoredContentType = isIgnoredContentType;
454
587
  exports.loadersFactory = loadersFactory;
455
588
  exports.logTransferFilterSummary = logTransferFilterSummary;
589
+ exports.normalizeTransferFilterOptions = normalizeTransferFilterOptions;
590
+ exports.normalizeTransferFilterOptionsHook = normalizeTransferFilterOptionsHook;
591
+ exports.onlyContentTypesOption = onlyContentTypesOption;
456
592
  exports.onlyOption = onlyOption;
457
593
  exports.parseRestoreFromOptions = parseRestoreFromOptions;
458
594
  exports.setSignalHandler = setSignalHandler;
459
595
  exports.shouldSkipStage = shouldSkipStage;
460
596
  exports.throttleOption = throttleOption;
597
+ exports.validateContentTypeTransferOptions = validateContentTypeTransferOptions;
598
+ exports.validateContentTypeTransferOptionsForStrapi = validateContentTypeTransferOptionsForStrapi;
461
599
  exports.validateExcludeOnly = validateExcludeOnly;
462
600
  //# sourceMappingURL=data-transfer.js.map