@strapi/strapi 5.42.1 → 5.44.0

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 (83) hide show
  1. package/dist/cli/commands/admin/active-user.d.ts +15 -0
  2. package/dist/cli/commands/admin/active-user.d.ts.map +1 -0
  3. package/dist/cli/commands/admin/block-user.d.ts +15 -0
  4. package/dist/cli/commands/admin/block-user.d.ts.map +1 -0
  5. package/dist/cli/commands/admin/delete-user.d.ts +14 -0
  6. package/dist/cli/commands/admin/delete-user.d.ts.map +1 -0
  7. package/dist/cli/commands/admin/list-users.d.ts +11 -0
  8. package/dist/cli/commands/admin/list-users.d.ts.map +1 -0
  9. package/dist/cli/commands/export/action.d.ts.map +1 -1
  10. package/dist/cli/commands/import/action.d.ts.map +1 -1
  11. package/dist/cli/commands/index.d.ts.map +1 -1
  12. package/dist/cli/commands/transfer/action.d.ts +1 -0
  13. package/dist/cli/commands/transfer/action.d.ts.map +1 -1
  14. package/dist/cli/commands/transfer/command.d.ts.map +1 -1
  15. package/dist/cli/utils/data-transfer.d.ts +6 -4
  16. package/dist/cli/utils/data-transfer.d.ts.map +1 -1
  17. package/dist/cli/utils/helpers.d.ts +15 -1
  18. package/dist/cli/utils/helpers.d.ts.map +1 -1
  19. package/dist/node/build.d.ts.map +1 -1
  20. package/dist/node/develop.d.ts.map +1 -1
  21. package/dist/package.json.js +1 -1
  22. package/dist/package.json.mjs +1 -1
  23. package/dist/src/cli/commands/admin/active-user.js +73 -0
  24. package/dist/src/cli/commands/admin/active-user.js.map +1 -0
  25. package/dist/src/cli/commands/admin/active-user.mjs +70 -0
  26. package/dist/src/cli/commands/admin/active-user.mjs.map +1 -0
  27. package/dist/src/cli/commands/admin/block-user.js +73 -0
  28. package/dist/src/cli/commands/admin/block-user.js.map +1 -0
  29. package/dist/src/cli/commands/admin/block-user.mjs +70 -0
  30. package/dist/src/cli/commands/admin/block-user.mjs.map +1 -0
  31. package/dist/src/cli/commands/admin/delete-user.js +88 -0
  32. package/dist/src/cli/commands/admin/delete-user.js.map +1 -0
  33. package/dist/src/cli/commands/admin/delete-user.mjs +85 -0
  34. package/dist/src/cli/commands/admin/delete-user.mjs.map +1 -0
  35. package/dist/src/cli/commands/admin/list-users.js +62 -0
  36. package/dist/src/cli/commands/admin/list-users.js.map +1 -0
  37. package/dist/src/cli/commands/admin/list-users.mjs +59 -0
  38. package/dist/src/cli/commands/admin/list-users.mjs.map +1 -0
  39. package/dist/src/cli/commands/export/action.js +2 -2
  40. package/dist/src/cli/commands/export/action.js.map +1 -1
  41. package/dist/src/cli/commands/export/action.mjs +3 -3
  42. package/dist/src/cli/commands/export/action.mjs.map +1 -1
  43. package/dist/src/cli/commands/import/action.js +3 -3
  44. package/dist/src/cli/commands/import/action.js.map +1 -1
  45. package/dist/src/cli/commands/import/action.mjs +4 -4
  46. package/dist/src/cli/commands/import/action.mjs.map +1 -1
  47. package/dist/src/cli/commands/index.js +8 -0
  48. package/dist/src/cli/commands/index.js.map +1 -1
  49. package/dist/src/cli/commands/index.mjs +34 -26
  50. package/dist/src/cli/commands/index.mjs.map +1 -1
  51. package/dist/src/cli/commands/transfer/action.js +105 -6
  52. package/dist/src/cli/commands/transfer/action.js.map +1 -1
  53. package/dist/src/cli/commands/transfer/action.mjs +107 -8
  54. package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
  55. package/dist/src/cli/commands/transfer/command.js +1 -1
  56. package/dist/src/cli/commands/transfer/command.js.map +1 -1
  57. package/dist/src/cli/commands/transfer/command.mjs +1 -1
  58. package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
  59. package/dist/src/cli/utils/data-transfer.js +69 -21
  60. package/dist/src/cli/utils/data-transfer.js.map +1 -1
  61. package/dist/src/cli/utils/data-transfer.mjs +70 -22
  62. package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
  63. package/dist/src/cli/utils/helpers.js +36 -1
  64. package/dist/src/cli/utils/helpers.js.map +1 -1
  65. package/dist/src/cli/utils/helpers.mjs +34 -2
  66. package/dist/src/cli/utils/helpers.mjs.map +1 -1
  67. package/dist/src/node/build.js +10 -5
  68. package/dist/src/node/build.js.map +1 -1
  69. package/dist/src/node/build.mjs +10 -5
  70. package/dist/src/node/build.mjs.map +1 -1
  71. package/dist/src/node/develop.js +194 -148
  72. package/dist/src/node/develop.js.map +1 -1
  73. package/dist/src/node/develop.mjs +194 -148
  74. package/dist/src/node/develop.mjs.map +1 -1
  75. package/dist/src/node/vite/config.js +2 -1
  76. package/dist/src/node/vite/config.js.map +1 -1
  77. package/dist/src/node/vite/config.mjs +2 -1
  78. package/dist/src/node/vite/config.mjs.map +1 -1
  79. package/dist/src/node/webpack/config.js +2 -2
  80. package/dist/src/node/webpack/config.js.map +1 -1
  81. package/dist/src/node/webpack/config.mjs +2 -2
  82. package/dist/src/node/webpack/config.mjs.map +1 -1
  83. package/package.json +28 -28
@@ -1,15 +1,29 @@
1
1
  import { isObject } from 'lodash/fp';
2
+ import ora from 'ora';
2
3
  import { engine, strapi } from '@strapi/data-transfer';
3
- import { createStrapiInstance, parseRestoreFromOptions, DEFAULT_IGNORED_CONTENT_TYPES, formatDiagnostic, getDiffHandler, getAssetsBackupHandler, getTransferTelemetryPayload, setSignalHandler, abortTransfer, buildTransferTable, exitMessageText, loadersFactory } from '../../utils/data-transfer.mjs';
4
- import { exitWith } from '../../utils/helpers.mjs';
4
+ import { createStrapiInstance, parseRestoreFromOptions, isIgnoredContentType, formatDiagnostic, getDiffHandler, getAssetsBackupHandler, getTransferTelemetryPayload, setSignalHandler, abortTransfer, buildTransferTable, exitMessageText, loadersFactory } from '../../utils/data-transfer.mjs';
5
+ import { exitWith, TRANSFER_PROGRESS_FIELD_SEP, formatElapsedAndMaybeRemainingLabel } from '../../utils/helpers.mjs';
5
6
 
6
7
  const { createTransferEngine } = engine;
7
8
  const { providers: { createRemoteStrapiDestinationProvider, createLocalStrapiSourceProvider, createLocalStrapiDestinationProvider, createRemoteStrapiSourceProvider } } = strapi;
9
+ const resolveRemotePullAssetIdleTimeoutMs = (value)=>{
10
+ if (value == null || value === '') {
11
+ return undefined;
12
+ }
13
+ const n = typeof value === 'number' ? value : Number(value);
14
+ if (!Number.isFinite(n) || n <= 0) {
15
+ return undefined;
16
+ }
17
+ return n;
18
+ };
8
19
  /**
9
20
  * Transfer command.
10
21
  *
11
22
  * Transfers data between local Strapi and remote Strapi instances
12
23
  */ var action = (async (opts)=>{
24
+ // Avoid DeprecationWarning lines on stderr (e.g. pg `client.query()` while a query is in flight)
25
+ // interleaving with ora spinners during transfer. (Runtime API; not on all @types/node Process typings.)
26
+ process.noDeprecation = true;
13
27
  // Validate inputs from Commander
14
28
  if (!isObject(opts)) {
15
29
  exitWith(1, 'Could not parse command arguments');
@@ -18,6 +32,7 @@ const { providers: { createRemoteStrapiDestinationProvider, createLocalStrapiSou
18
32
  exitWith(1, 'Exactly one source (from) or destination (to) option must be provided');
19
33
  }
20
34
  const strapi = await createStrapiInstance();
35
+ const checksumsEnabled = opts.checksums !== false;
21
36
  let source;
22
37
  let destination;
23
38
  // if no URL provided, use local Strapi
@@ -29,21 +44,33 @@ const { providers: { createRemoteStrapiDestinationProvider, createLocalStrapiSou
29
44
  if (!opts.fromToken) {
30
45
  exitWith(1, 'Missing token for remote destination');
31
46
  }
47
+ const assetIdleTimeoutMs = resolveRemotePullAssetIdleTimeoutMs(strapi.config.get('server.transfer.remote.assetIdleTimeoutMs'));
32
48
  source = createRemoteStrapiSourceProvider({
33
49
  getStrapi: ()=>strapi,
34
50
  url: opts.from,
35
51
  auth: {
36
52
  type: 'token',
37
53
  token: opts.fromToken
38
- }
54
+ },
55
+ ...assetIdleTimeoutMs !== undefined ? {
56
+ streamTimeout: assetIdleTimeoutMs
57
+ } : {},
58
+ ...checksumsEnabled ? {
59
+ verifyChecksums: true
60
+ } : {}
39
61
  });
40
62
  }
63
+ /** Wired after `engine` exists so destination prep can update the CLI spinner. */ const transferPhaseBridge = {
64
+ emit () {
65
+ /* replaced below once `progress` exists */ }
66
+ };
41
67
  // if no URL provided, use local Strapi
42
68
  if (!opts.to) {
43
69
  destination = createLocalStrapiDestinationProvider({
44
70
  getStrapi: ()=>strapi,
45
71
  strategy: 'restore',
46
- restore: parseRestoreFromOptions(opts)
72
+ restore: parseRestoreFromOptions(opts, strapi),
73
+ onTransferPhase: (message)=>transferPhaseBridge.emit(message)
47
74
  });
48
75
  } else {
49
76
  if (!opts.toToken) {
@@ -56,7 +83,11 @@ const { providers: { createRemoteStrapiDestinationProvider, createLocalStrapiSou
56
83
  token: opts.toToken
57
84
  },
58
85
  strategy: 'restore',
59
- restore: parseRestoreFromOptions(opts)
86
+ restore: parseRestoreFromOptions(opts, strapi),
87
+ onTransferPhase: (message)=>transferPhaseBridge.emit(message),
88
+ ...checksumsEnabled ? {
89
+ verifyChecksums: true
90
+ } : {}
60
91
  });
61
92
  }
62
93
  if (!source || !destination) {
@@ -72,14 +103,14 @@ const { providers: { createRemoteStrapiDestinationProvider, createLocalStrapiSou
72
103
  links: [
73
104
  {
74
105
  filter (link) {
75
- return !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) && !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type);
106
+ return !isIgnoredContentType(link.left.type) && !isIgnoredContentType(link.right.type);
76
107
  }
77
108
  }
78
109
  ],
79
110
  entities: [
80
111
  {
81
112
  filter (entity) {
82
- return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);
113
+ return !isIgnoredContentType(entity.type);
83
114
  }
84
115
  }
85
116
  ]
@@ -87,7 +118,39 @@ const { providers: { createRemoteStrapiDestinationProvider, createLocalStrapiSou
87
118
  });
88
119
  engine.diagnostics.onDiagnostic(formatDiagnostic('transfer', opts.verbose));
89
120
  const progress = engine.progress.stream;
121
+ /** Shown until destination prep emits a step; then we keep this prefix and append the step after " — ". */ const STARTING_TRANSFER_PREFIX = 'Starting transfer…';
122
+ let prepStepDetail = null;
123
+ const formatPrepSpinnerLine = ()=>prepStepDetail != null && prepStepDetail !== '' ? `${STARTING_TRANSFER_PREFIX} — ${prepStepDetail}` : STARTING_TRANSFER_PREFIX;
124
+ transferPhaseBridge.emit = (message)=>{
125
+ prepStepDetail = message;
126
+ progress.emit('transfer::phase', {
127
+ message: formatPrepSpinnerLine()
128
+ });
129
+ };
90
130
  const { updateLoader } = loadersFactory();
131
+ let startingSpinner = null;
132
+ let startingElapsedInterval = null;
133
+ /** Set when `transfer::start` fires so we can print a final persisted line with elapsed time. */ let transferPrepStartedAt = null;
134
+ /**
135
+ * Stops the "starting transfer" spinner and **leaves a finished line** in the console (like stage
136
+ * `succeed`/`fail`), so the next stage spinner starts on a new line instead of replacing this one.
137
+ */ const finishStartingSpinner = (outcome = 'done')=>{
138
+ if (startingElapsedInterval) {
139
+ clearInterval(startingElapsedInterval);
140
+ startingElapsedInterval = null;
141
+ }
142
+ if (startingSpinner) {
143
+ const elapsed = transferPrepStartedAt != null ? Date.now() - transferPrepStartedAt : 0;
144
+ const line = `${formatPrepSpinnerLine()}${TRANSFER_PROGRESS_FIELD_SEP}${formatElapsedAndMaybeRemainingLabel(elapsed, null)}`;
145
+ if (outcome === 'fail') {
146
+ startingSpinner.fail(line);
147
+ } else {
148
+ startingSpinner.succeed(line);
149
+ }
150
+ startingSpinner = null;
151
+ transferPrepStartedAt = null;
152
+ }
153
+ };
91
154
  engine.onSchemaDiff(getDiffHandler(engine, {
92
155
  force: opts.force,
93
156
  action: 'transfer'
@@ -96,20 +159,56 @@ const { providers: { createRemoteStrapiDestinationProvider, createLocalStrapiSou
96
159
  force: opts.force,
97
160
  action: 'transfer'
98
161
  }));
162
+ // Update more frequently to ensure elapsed time is accurate even if the stage is not progressing
163
+ const activeStages = new Set();
164
+ const lastStageData = {};
165
+ const interval = setInterval(()=>{
166
+ for (const stage of activeStages){
167
+ if (lastStageData[stage]) {
168
+ // Clone the lastStageData and ensure endTime is undefined so elapsed uses Date.now()
169
+ const dataCopy = {
170
+ ...lastStageData[stage],
171
+ endTime: undefined
172
+ };
173
+ updateLoader(stage, {
174
+ [stage]: dataCopy
175
+ });
176
+ }
177
+ }
178
+ }, 100);
99
179
  progress.on(`stage::start`, ({ stage, data })=>{
180
+ finishStartingSpinner('done');
100
181
  updateLoader(stage, data).start();
101
182
  });
102
183
  progress.on('stage::finish', ({ stage, data })=>{
103
184
  updateLoader(stage, data).succeed();
104
185
  });
105
186
  progress.on('stage::progress', ({ stage, data })=>{
187
+ lastStageData[stage] = data[stage];
188
+ activeStages.add(stage);
106
189
  updateLoader(stage, data);
107
190
  });
108
191
  progress.on('stage::error', ({ stage, data })=>{
109
192
  updateLoader(stage, data).fail();
110
193
  });
194
+ progress.on('transfer::finish', ()=>{
195
+ finishStartingSpinner('done');
196
+ clearInterval(interval);
197
+ });
198
+ progress.on('transfer::error', ()=>{
199
+ finishStartingSpinner('fail');
200
+ clearInterval(interval);
201
+ });
111
202
  progress.on('transfer::start', async ()=>{
112
- console.log(`Starting transfer...`);
203
+ transferPrepStartedAt = Date.now();
204
+ prepStepDetail = null;
205
+ startingSpinner = ora(formatPrepSpinnerLine()).start();
206
+ startingElapsedInterval = setInterval(()=>{
207
+ if (startingSpinner && transferPrepStartedAt != null) {
208
+ const elapsed = Date.now() - transferPrepStartedAt;
209
+ startingSpinner.text = `${formatPrepSpinnerLine()}${TRANSFER_PROGRESS_FIELD_SEP}${formatElapsedAndMaybeRemainingLabel(elapsed, null)}`;
210
+ }
211
+ }, 100);
113
212
  await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));
114
213
  });
115
214
  let results;
@@ -1 +1 @@
1
- {"version":3,"file":"action.mjs","sources":["../../../../../src/cli/commands/transfer/action.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { engine as engineDataTransfer, strapi as strapiDataTransfer } from '@strapi/data-transfer';\n\nimport {\n buildTransferTable,\n createStrapiInstance,\n DEFAULT_IGNORED_CONTENT_TYPES,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n getDiffHandler,\n getAssetsBackupHandler,\n parseRestoreFromOptions,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\n\nconst { createTransferEngine } = engineDataTransfer;\nconst {\n providers: {\n createRemoteStrapiDestinationProvider,\n createLocalStrapiSourceProvider,\n createLocalStrapiDestinationProvider,\n createRemoteStrapiSourceProvider,\n },\n} = strapiDataTransfer;\n\ninterface CmdOptions {\n from?: URL;\n fromToken: string;\n to: URL;\n toToken: string;\n verbose?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n throttle?: number;\n force?: boolean;\n}\n/**\n * Transfer command.\n *\n * Transfers data between local Strapi and remote Strapi instances\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n if (!(opts.from || opts.to) || (opts.from && opts.to)) {\n exitWith(1, 'Exactly one source (from) or destination (to) option must be provided');\n }\n\n const strapi = await createStrapiInstance();\n let source;\n let destination;\n\n // if no URL provided, use local Strapi\n if (!opts.from) {\n source = createLocalStrapiSourceProvider({\n getStrapi: () => strapi,\n });\n }\n // if URL provided, set up a remote source provider\n else {\n if (!opts.fromToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n source = createRemoteStrapiSourceProvider({\n getStrapi: () => strapi,\n url: opts.from,\n auth: {\n type: 'token',\n token: opts.fromToken,\n },\n });\n }\n\n // if no URL provided, use local Strapi\n if (!opts.to) {\n destination = createLocalStrapiDestinationProvider({\n getStrapi: () => strapi,\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n // if URL provided, set up a remote destination provider\n else {\n if (!opts.toToken) {\n exitWith(1, 'Missing token for remote destination');\n }\n\n destination = createRemoteStrapiDestinationProvider({\n url: opts.to,\n auth: {\n type: 'token',\n token: opts.toToken,\n },\n strategy: 'restore',\n restore: parseRestoreFromOptions(opts),\n });\n }\n\n if (!source || !destination) {\n exitWith(1, 'Could not create providers');\n }\n\n const engine = createTransferEngine(source, destination, {\n versionStrategy: 'exact',\n schemaStrategy: 'strict',\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: {\n links: [\n {\n filter(link) {\n return (\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.left.type) &&\n !DEFAULT_IGNORED_CONTENT_TYPES.includes(link.right.type)\n );\n },\n },\n ],\n entities: [\n {\n filter(entity) {\n return !DEFAULT_IGNORED_CONTENT_TYPES.includes(entity.type);\n },\n },\n ],\n },\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('transfer', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n engine.onSchemaDiff(getDiffHandler(engine, { force: opts.force, action: 'transfer' }));\n\n engine.addErrorHandler(\n 'ASSETS_DIRECTORY_ERR',\n getAssetsBackupHandler(engine, { force: opts.force, action: 'transfer' })\n );\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('stage::error', ({ stage, data }) => {\n updateLoader(stage, data).fail();\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting transfer...`);\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: Awaited<ReturnType<typeof engine.transfer>>;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch (e) {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n exitWith(0, exitMessageText('transfer'));\n } catch (e) {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('transfer', true));\n }\n};\n"],"names":["createTransferEngine","engineDataTransfer","providers","createRemoteStrapiDestinationProvider","createLocalStrapiSourceProvider","createLocalStrapiDestinationProvider","createRemoteStrapiSourceProvider","strapiDataTransfer","opts","isObject","exitWith","from","to","strapi","createStrapiInstance","source","destination","getStrapi","fromToken","url","auth","type","token","strategy","restore","parseRestoreFromOptions","toToken","engine","versionStrategy","schemaStrategy","exclude","only","throttle","transforms","links","filter","link","DEFAULT_IGNORED_CONTENT_TYPES","includes","left","right","entities","entity","diagnostics","onDiagnostic","formatDiagnostic","verbose","progress","stream","updateLoader","loadersFactory","onSchemaDiff","getDiffHandler","force","action","addErrorHandler","getAssetsBackupHandler","on","stage","data","start","succeed","fail","console","log","telemetry","send","getTransferTelemetryPayload","results","setSignalHandler","abortTransfer","transfer","table","buildTransferTable","toString","e","error","exitMessageText"],"mappings":"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"}
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} 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 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","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('--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.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
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(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":"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"}
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":"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"}
@@ -8,7 +8,7 @@ import action from './action.mjs';
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('--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(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
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(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":"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"}
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":"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"}