@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.
- package/dist/cli/commands/export/action.d.ts +3 -0
- package/dist/cli/commands/export/action.d.ts.map +1 -1
- package/dist/cli/commands/export/command.d.ts.map +1 -1
- package/dist/cli/commands/import/action.d.ts +3 -0
- package/dist/cli/commands/import/action.d.ts.map +1 -1
- package/dist/cli/commands/import/command.d.ts.map +1 -1
- package/dist/cli/commands/transfer/action.d.ts +3 -0
- package/dist/cli/commands/transfer/action.d.ts.map +1 -1
- package/dist/cli/commands/transfer/command.d.ts.map +1 -1
- package/dist/cli/utils/data-transfer.d.ts +56 -4
- package/dist/cli/utils/data-transfer.d.ts.map +1 -1
- package/dist/node/core/admin-vite-alias-modules.d.ts +7 -2
- package/dist/node/core/admin-vite-alias-modules.d.ts.map +1 -1
- package/dist/node/core/admin-vite-aliases.d.ts +22 -1
- package/dist/node/core/admin-vite-aliases.d.ts.map +1 -1
- package/dist/node/core/admin-vite-optimize-exclude.d.ts.map +1 -1
- package/dist/node/core/admin-vite-singleton-modules.d.ts +14 -0
- package/dist/node/core/admin-vite-singleton-modules.d.ts.map +1 -0
- package/dist/node/core/dependencies.d.ts.map +1 -1
- package/dist/node/core/resolve-module.d.ts +14 -2
- package/dist/node/core/resolve-module.d.ts.map +1 -1
- package/dist/node/create-build-context.d.ts.map +1 -1
- package/dist/node/vite/config.d.ts.map +1 -1
- package/dist/node/webpack/config.d.ts.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/export/action.js +7 -17
- package/dist/src/cli/commands/export/action.js.map +1 -1
- package/dist/src/cli/commands/export/action.mjs +8 -18
- package/dist/src/cli/commands/export/action.mjs.map +1 -1
- package/dist/src/cli/commands/export/command.js +1 -1
- package/dist/src/cli/commands/export/command.js.map +1 -1
- package/dist/src/cli/commands/export/command.mjs +2 -2
- package/dist/src/cli/commands/export/command.mjs.map +1 -1
- package/dist/src/cli/commands/import/action.js +8 -16
- package/dist/src/cli/commands/import/action.js.map +1 -1
- package/dist/src/cli/commands/import/action.mjs +9 -17
- package/dist/src/cli/commands/import/action.mjs.map +1 -1
- package/dist/src/cli/commands/import/command.js +1 -1
- package/dist/src/cli/commands/import/command.js.map +1 -1
- package/dist/src/cli/commands/import/command.mjs +2 -2
- package/dist/src/cli/commands/import/command.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/action.js +7 -17
- package/dist/src/cli/commands/transfer/action.js.map +1 -1
- package/dist/src/cli/commands/transfer/action.mjs +8 -18
- package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/command.js +1 -1
- package/dist/src/cli/commands/transfer/command.js.map +1 -1
- package/dist/src/cli/commands/transfer/command.mjs +2 -2
- package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
- package/dist/src/cli/utils/data-transfer.js +148 -10
- package/dist/src/cli/utils/data-transfer.js.map +1 -1
- package/dist/src/cli/utils/data-transfer.mjs +138 -12
- package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-alias-modules.js +10 -1
- package/dist/src/node/core/admin-vite-alias-modules.js.map +1 -1
- package/dist/src/node/core/admin-vite-alias-modules.mjs +10 -2
- package/dist/src/node/core/admin-vite-alias-modules.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-aliases.js +44 -5
- package/dist/src/node/core/admin-vite-aliases.js.map +1 -1
- package/dist/src/node/core/admin-vite-aliases.mjs +44 -7
- package/dist/src/node/core/admin-vite-aliases.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-optimize-exclude.js +4 -0
- package/dist/src/node/core/admin-vite-optimize-exclude.js.map +1 -1
- package/dist/src/node/core/admin-vite-optimize-exclude.mjs +4 -0
- package/dist/src/node/core/admin-vite-optimize-exclude.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-singleton-modules.js +24 -0
- package/dist/src/node/core/admin-vite-singleton-modules.js.map +1 -0
- package/dist/src/node/core/admin-vite-singleton-modules.mjs +22 -0
- package/dist/src/node/core/admin-vite-singleton-modules.mjs.map +1 -0
- package/dist/src/node/core/dependencies.js +3 -2
- package/dist/src/node/core/dependencies.js.map +1 -1
- package/dist/src/node/core/dependencies.mjs +3 -2
- package/dist/src/node/core/dependencies.mjs.map +1 -1
- package/dist/src/node/core/resolve-module.js +25 -12
- package/dist/src/node/core/resolve-module.js.map +1 -1
- package/dist/src/node/core/resolve-module.mjs +25 -13
- package/dist/src/node/core/resolve-module.mjs.map +1 -1
- package/dist/src/node/create-build-context.js +5 -2
- package/dist/src/node/create-build-context.js.map +1 -1
- package/dist/src/node/create-build-context.mjs +5 -2
- package/dist/src/node/create-build-context.mjs.map +1 -1
- package/dist/src/node/vite/config.js +13 -1
- package/dist/src/node/vite/config.js.map +1 -1
- package/dist/src/node/vite/config.mjs +14 -2
- package/dist/src/node/vite/config.mjs.map +1 -1
- package/dist/src/node/webpack/config.js +5 -0
- package/dist/src/node/webpack/config.js.map +1 -1
- package/dist/src/node/webpack/config.mjs +5 -0
- package/dist/src/node/webpack/config.mjs.map +1 -1
- 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,
|
|
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":"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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 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":"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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 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
|
|
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: ${
|
|
169
|
-
const onlyOption = new commander.Option('--only <command-separated data types>', `Include only these types (plus schemas): ${
|
|
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
|
-
|
|
410
|
-
|
|
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
|